summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNiall Bunting <niall.bunting@hpe.com>2016-05-09 16:23:33 +0000
committerNiall Bunting <niall.bunting@hpe.com>2016-05-24 13:23:18 +0000
commitf6b9e791c35a085cd6d9fd5e5a87aa5cc5fadb00 (patch)
tree02726278a638e024578e497248d656c8ca7716eb
parent769790b4895b02aedfab588255142451a32f440d (diff)
downloadpython-glanceclient-f6b9e791c35a085cd6d9fd5e5a87aa5cc5fadb00.tar.gz
Get endpoint if os_image_url is not set
If env['OS_IMAGE_URL'] is not set then None is returned. This is then used ignoring the endpoint_type, service_type and region_name. This patch will use those values if the endpoint is None. Change-Id: I76cc527b05d2be75d3dbc33123a0d71be97fe25c Closes-bug: #1579768 (cherry picked from commit a862196cfb7f7323b1864b4c1660c39850487a64)
-rwxr-xr-xglanceclient/shell.py11
-rw-r--r--glanceclient/tests/unit/test_shell.py93
2 files changed, 87 insertions, 17 deletions
diff --git a/glanceclient/shell.py b/glanceclient/shell.py
index 2603aa2..ffcb0cf 100755
--- a/glanceclient/shell.py
+++ b/glanceclient/shell.py
@@ -441,7 +441,16 @@ class OpenStackImagesShell(object):
}
else:
kwargs = self._get_kwargs_for_create_session(args)
- kwargs = {'session': self._get_keystone_session(**kwargs)}
+ ks_session = self._get_keystone_session(**kwargs)
+ kwargs = {'session': ks_session}
+
+ if endpoint is None:
+ endpoint_type = args.os_endpoint_type or 'public'
+ service_type = args.os_service_type or 'image'
+ endpoint = ks_session.get_endpoint(
+ service_type=service_type,
+ interface=endpoint_type,
+ region_name=args.os_region_name)
return glanceclient.Client(api_version, endpoint, **kwargs)
diff --git a/glanceclient/tests/unit/test_shell.py b/glanceclient/tests/unit/test_shell.py
index 7d0d357..925403b 100644
--- a/glanceclient/tests/unit/test_shell.py
+++ b/glanceclient/tests/unit/test_shell.py
@@ -30,7 +30,6 @@ import fixtures
from keystoneclient import exceptions as ks_exc
from keystoneclient import fixture as ks_fixture
import mock
-import requests
from requests_mock.contrib import fixture as rm_fixture
import six
@@ -44,7 +43,8 @@ from glanceclient.v2 import schemas as schemas
import json
-DEFAULT_IMAGE_URL = 'http://127.0.0.1:5000/'
+DEFAULT_IMAGE_URL = 'http://127.0.0.1:9292/'
+DEFAULT_IMAGE_URL_INTERNAL = 'http://127.0.0.1:9191/'
DEFAULT_USERNAME = 'username'
DEFAULT_PASSWORD = 'password'
DEFAULT_TENANT_ID = 'tenant_id'
@@ -56,6 +56,8 @@ DEFAULT_V2_AUTH_URL = '%sv2.0' % DEFAULT_UNVERSIONED_AUTH_URL
DEFAULT_V3_AUTH_URL = '%sv3' % DEFAULT_UNVERSIONED_AUTH_URL
DEFAULT_AUTH_TOKEN = ' 3bcc3d3a03f44e3d8377f9247b0ad155'
TEST_SERVICE_URL = 'http://127.0.0.1:5000/'
+DEFAULT_SERVICE_TYPE = 'image'
+DEFAULT_ENDPOINT_TYPE = 'public'
FAKE_V2_ENV = {'OS_USERNAME': DEFAULT_USERNAME,
'OS_PASSWORD': DEFAULT_PASSWORD,
@@ -70,6 +72,15 @@ FAKE_V3_ENV = {'OS_USERNAME': DEFAULT_USERNAME,
'OS_AUTH_URL': DEFAULT_V3_AUTH_URL,
'OS_IMAGE_URL': DEFAULT_IMAGE_URL}
+FAKE_V4_ENV = {'OS_USERNAME': DEFAULT_USERNAME,
+ 'OS_PASSWORD': DEFAULT_PASSWORD,
+ 'OS_PROJECT_ID': DEFAULT_PROJECT_ID,
+ 'OS_USER_DOMAIN_NAME': DEFAULT_USER_DOMAIN_NAME,
+ 'OS_AUTH_URL': DEFAULT_V3_AUTH_URL,
+ 'OS_SERVICE_TYPE': DEFAULT_SERVICE_TYPE,
+ 'OS_ENDPOINT_TYPE': DEFAULT_ENDPOINT_TYPE,
+ 'OS_AUTH_TOKEN': DEFAULT_AUTH_TOKEN}
+
TOKEN_ID = uuid.uuid4().hex
V2_TOKEN = ks_fixture.V2Token(token_id=TOKEN_ID)
@@ -80,7 +91,8 @@ _s.add_endpoint(DEFAULT_IMAGE_URL)
V3_TOKEN = ks_fixture.V3Token()
V3_TOKEN.set_project_scope()
_s = V3_TOKEN.add_service('image', name='glance')
-_s.add_standard_endpoints(public=DEFAULT_IMAGE_URL)
+_s.add_standard_endpoints(public=DEFAULT_IMAGE_URL,
+ internal=DEFAULT_IMAGE_URL_INTERNAL)
class ShellTest(testutils.TestCase):
@@ -102,7 +114,9 @@ class ShellTest(testutils.TestCase):
self.requests = self.useFixture(rm_fixture.Fixture())
json_list = ks_fixture.DiscoveryList(DEFAULT_UNVERSIONED_AUTH_URL)
- self.requests.get(DEFAULT_IMAGE_URL, json=json_list, status_code=300)
+ self.requests.get(DEFAULT_UNVERSIONED_AUTH_URL,
+ json=json_list,
+ status_code=300)
json_v2 = {'version': ks_fixture.V2Discovery(DEFAULT_V2_AUTH_URL)}
self.requests.get(DEFAULT_V2_AUTH_URL, json=json_v2)
@@ -352,18 +366,6 @@ class ShellTest(testutils.TestCase):
glance_shell.main(args)
self.assertEqual(1, mock_client.call_count)
- @mock.patch('glanceclient.v2.client.Client')
- def test_password_prompted_with_v2(self, v2_client):
- self.requests.post(self.token_url, exc=requests.ConnectionError)
-
- cli2 = mock.MagicMock()
- v2_client.return_value = cli2
- cli2.http_client.get.return_value = (None, {'versions': []})
- glance_shell = openstack_shell.OpenStackImagesShell()
- os.environ['OS_PASSWORD'] = 'password'
- self.assertRaises(exc.CommunicationError,
- glance_shell.main, ['image-list'])
-
@mock.patch('sys.stdin', side_effect=mock.MagicMock)
@mock.patch('getpass.getpass', side_effect=EOFError)
@mock.patch('glanceclient.v2.client.Client')
@@ -624,6 +626,65 @@ class ShellTestWithKeystoneV3Auth(ShellTest):
self.assertNotIn(r, stdout.split())
+class ShellTestWithNoOSImageURLPublic(ShellTestWithKeystoneV3Auth):
+ # auth environment to use
+ # default uses public
+ auth_env = FAKE_V4_ENV.copy()
+
+ def setUp(self):
+ super(ShellTestWithNoOSImageURLPublic, self).setUp()
+ self.image_url = DEFAULT_IMAGE_URL
+ self.requests.get(DEFAULT_IMAGE_URL + 'v2/images',
+ text='{"images": []}')
+
+ @mock.patch('glanceclient.v1.client.Client')
+ def test_auth_plugin_invocation_with_v1(self, v1_client):
+ args = '--os-image-api-version 1 image-list'
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ self.assertEqual(1, self.v3_auth.call_count)
+ self._assert_auth_plugin_args()
+
+ @mock.patch('glanceclient.v2.client.Client')
+ def test_auth_plugin_invocation_with_v2(self, v2_client):
+ args = '--os-image-api-version 2 image-list'
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ self.assertEqual(1, self.v3_auth.call_count)
+ self._assert_auth_plugin_args()
+
+ @mock.patch('glanceclient.v2.client.Client')
+ def test_endpoint_from_interface(self, v2_client):
+ args = ('--os-image-api-version 2 image-list')
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ assert v2_client.called
+ (args, kwargs) = v2_client.call_args
+ self.assertEqual(kwargs['endpoint_override'], self.image_url)
+
+ def test_endpoint_real_from_interface(self):
+ args = ('--os-image-api-version 2 image-list')
+ glance_shell = openstack_shell.OpenStackImagesShell()
+ glance_shell.main(args.split())
+ self.assertEqual(self.requests.request_history[2].url,
+ self.image_url + "v2/images?limit=20&"
+ "sort_key=name&sort_dir=asc")
+
+
+class ShellTestWithNoOSImageURLInternal(ShellTestWithNoOSImageURLPublic):
+ # auth environment to use
+ # this uses internal
+ FAKE_V5_ENV = FAKE_V4_ENV.copy()
+ FAKE_V5_ENV['OS_ENDPOINT_TYPE'] = 'internal'
+ auth_env = FAKE_V5_ENV.copy()
+
+ def setUp(self):
+ super(ShellTestWithNoOSImageURLPublic, self).setUp()
+ self.image_url = DEFAULT_IMAGE_URL_INTERNAL
+ self.requests.get(DEFAULT_IMAGE_URL_INTERNAL + 'v2/images',
+ text='{"images": []}')
+
+
class ShellCacheSchemaTest(testutils.TestCase):
def setUp(self):
super(ShellCacheSchemaTest, self).setUp()