From 061da46202759f55866d224f9ab8013e747637c7 Mon Sep 17 00:00:00 2001
From: Dazhao <dzyu@cn.ibm.com>
Date: Wed, 21 Aug 2013 12:54:19 +0800
Subject: [PATCH] Support glance client can get ipv6 image url correctly

This patch is for fix bug 1208784. In openstack ipv6 environment,
if the os image url is not provided, need use the provided host
to generate literal ipv6 image url.

Fixes bug 1208784

Change-Id: Icb71241a639db02d079348f086bd7bd5f0412609
---
 glanceclient/shell.py |  4 ++++
 tests/test_shell.py   | 11 +++++++++++
 2 files changed, 15 insertions(+)

diff --git a/glanceclient/shell.py b/glanceclient/shell.py
index e0124e5c..7931a1a3 100644
--- a/glanceclient/shell.py
+++ b/glanceclient/shell.py
@@ -23,6 +23,7 @@ import re
 import sys
 
 from keystoneclient.v2_0 import client as ksclient
+import netaddr
 
 import glanceclient
 from glanceclient import exc
@@ -347,6 +348,9 @@ class OpenStackImagesShell(object):
         if args.os_image_url:
             return args.os_image_url
         elif args.host:
+            # Check if it is legal ipv6 address, if so, need wrap it with '[]'
+            if netaddr.valid_ipv6(args.host):
+                args.host = '[%s]' % args.host
             scheme = 'https' if args.use_ssl else 'http'
             return '%s://%s:%s/' % (scheme, args.host, args.port)
         else:
diff --git a/tests/test_shell.py b/tests/test_shell.py
index a895c2db..91793b25 100644
--- a/tests/test_shell.py
+++ b/tests/test_shell.py
@@ -80,3 +80,14 @@ class ShellTest(utils.TestCase):
             add_help=False,
             formatter_class=openstack_shell.HelpFormatter,)
         self.assertTrue(expected, actual_parser)
+
+    def test_get_image_url_by_ipv6Addr_host(self):
+        fake_args = lambda: None
+        setattr(fake_args, 'os_image_url', None)
+        setattr(fake_args, 'host', '2011:2013:1:f101::1')
+        setattr(fake_args, 'use_ssl', True)
+        setattr(fake_args, 'port', '9292')
+        expected_image_url = 'https://[2011:2013:1:f101::1]:9292/'
+        test_shell = openstack_shell.OpenStackImagesShell()
+        targeted_image_url = test_shell._get_image_url(fake_args)
+        self.assertEqual(expected_image_url, targeted_image_url)