summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-07-03 02:48:47 +0000
committerGerrit Code Review <review@openstack.org>2015-07-03 02:48:47 +0000
commitee64c2fa6b9eb6f8d628e8899df39a4ee01c2bb3 (patch)
tree57e047252b843c67eef60fa4a1a8358dbac9f173 /openstackclient
parentd80deaba41d09534a3f5a670957b4b0d035509b6 (diff)
parent5521e4c504c6a3a06f17a9e4f80444743aa293c7 (diff)
downloadpython-openstackclient-ee64c2fa6b9eb6f8d628e8899df39a4ee01c2bb3.tar.gz
Merge "Add --os-endpoint-type cli optional argument"
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/common/clientmanager.py10
-rw-r--r--openstackclient/common/utils.py8
-rw-r--r--openstackclient/compute/client.py5
-rw-r--r--openstackclient/identity/client.py7
-rw-r--r--openstackclient/image/client.py2
-rw-r--r--openstackclient/network/client.py6
-rw-r--r--openstackclient/object/client.py1
-rw-r--r--openstackclient/shell.py14
-rw-r--r--openstackclient/tests/common/test_clientmanager.py11
-rw-r--r--openstackclient/tests/common/test_utils.py10
-rw-r--r--openstackclient/tests/fakes.py2
-rw-r--r--openstackclient/tests/test_shell.py8
-rw-r--r--openstackclient/volume/client.py5
13 files changed, 85 insertions, 4 deletions
diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py
index 0159ad7d..fae95630 100644
--- a/openstackclient/common/clientmanager.py
+++ b/openstackclient/common/clientmanager.py
@@ -86,6 +86,7 @@ class ClientManager(object):
self._pw_callback = pw_func
self._url = self._cli_options.auth.get('url', None)
self._region_name = self._cli_options.region_name
+ self._endpoint_type = self._cli_options.endpoint_type
self.timing = self._cli_options.timing
@@ -183,18 +184,23 @@ class ClientManager(object):
self._auth_ref = self.auth.get_auth_ref(self.session)
return self._auth_ref
- def get_endpoint_for_service_type(self, service_type, region_name=None):
+ def get_endpoint_for_service_type(self, service_type, region_name=None,
+ endpoint_type='public'):
"""Return the endpoint URL for the service type."""
+ if not endpoint_type:
+ endpoint_type = 'public'
# See if we are using password flow auth, i.e. we have a
# service catalog to select endpoints from
if self.auth_ref:
endpoint = self.auth_ref.service_catalog.url_for(
service_type=service_type,
region_name=region_name,
+ endpoint_type=endpoint_type,
)
else:
# Get the passed endpoint directly from the auth plugin
- endpoint = self.auth.get_endpoint(self.session)
+ endpoint = self.auth.get_endpoint(self.session,
+ interface=endpoint_type)
return endpoint
diff --git a/openstackclient/common/utils.py b/openstackclient/common/utils.py
index c824678e..6cd35c05 100644
--- a/openstackclient/common/utils.py
+++ b/openstackclient/common/utils.py
@@ -368,3 +368,11 @@ def read_blob_file_contents(blob_file):
except IOError:
msg = "Error occurred trying to read from file %s"
raise exceptions.CommandError(msg % blob_file)
+
+
+def build_kwargs_dict(arg_name, value):
+ """Return a dictionary containing `arg_name` if `value` is set."""
+ kwargs = {}
+ if value:
+ kwargs[arg_name] = value
+ return kwargs
diff --git a/openstackclient/compute/client.py b/openstackclient/compute/client.py
index 93a7b715..27d63a95 100644
--- a/openstackclient/compute/client.py
+++ b/openstackclient/compute/client.py
@@ -48,12 +48,17 @@ def make_client(instance):
extensions = [extension.Extension('list_extensions', list_extensions)]
+ # Remember endpoint_type only if it is set
+ kwargs = utils.build_kwargs_dict('endpoint_type',
+ instance._endpoint_type)
+
client = compute_client(
session=instance.session,
extensions=extensions,
http_log_debug=http_log_debug,
timings=instance.timing,
region_name=instance._region_name,
+ **kwargs
)
return client
diff --git a/openstackclient/identity/client.py b/openstackclient/identity/client.py
index 4127a451..cc803511 100644
--- a/openstackclient/identity/client.py
+++ b/openstackclient/identity/client.py
@@ -46,10 +46,15 @@ def make_client(instance):
API_VERSIONS)
LOG.debug('Instantiating identity client: %s', identity_client)
+ # Remember interface only if endpoint_type is set
+ kwargs = utils.build_kwargs_dict('interface',
+ instance._endpoint_type)
+
client = identity_client(
session=instance.session,
region_name=instance._region_name,
- )
+ **kwargs
+ )
return client
diff --git a/openstackclient/image/client.py b/openstackclient/image/client.py
index c78f4425..8e2d6cd9 100644
--- a/openstackclient/image/client.py
+++ b/openstackclient/image/client.py
@@ -46,6 +46,7 @@ def make_client(instance):
endpoint = instance.get_endpoint_for_service_type(
API_NAME,
region_name=instance._region_name,
+ endpoint_type=instance._endpoint_type,
)
client = image_client(
@@ -68,6 +69,7 @@ def make_client(instance):
endpoint=instance.get_endpoint_for_service_type(
IMAGE_API_TYPE,
region_name=instance._region_name,
+ endpoint_type=instance._endpoint_type,
)
)
diff --git a/openstackclient/network/client.py b/openstackclient/network/client.py
index 870566aa..de08e5e2 100644
--- a/openstackclient/network/client.py
+++ b/openstackclient/network/client.py
@@ -47,11 +47,17 @@ def make_client(instance):
endpoint = instance.get_endpoint_for_service_type(
API_NAME,
region_name=instance._region_name,
+ endpoint_type=instance._endpoint_type,
)
+ # Remember endpoint_type only if it is set
+ kwargs = utils.build_kwargs_dict('endpoint_type',
+ instance._endpoint_type)
+
client = network_client(
session=instance.session,
region_name=instance._region_name,
+ **kwargs
)
network_api = utils.get_client_class(
diff --git a/openstackclient/object/client.py b/openstackclient/object/client.py
index beb7c04f..676f6642 100644
--- a/openstackclient/object/client.py
+++ b/openstackclient/object/client.py
@@ -36,6 +36,7 @@ def make_client(instance):
endpoint = instance.get_endpoint_for_service_type(
'object-store',
region_name=instance._region_name,
+ endpoint_type=instance._endpoint_type,
)
client = object_store_v1.APIv1(
diff --git a/openstackclient/shell.py b/openstackclient/shell.py
index 4109b8bc..b4e5904c 100644
--- a/openstackclient/shell.py
+++ b/openstackclient/shell.py
@@ -209,6 +209,15 @@ class OpenStackShell(app.App):
DEFAULT_DOMAIN +
' (Env: OS_DEFAULT_DOMAIN)')
parser.add_argument(
+ '--os-endpoint-type',
+ metavar='<endpoint-type>',
+ dest='endpoint_type',
+ choices=['admin', 'public', 'internal'],
+ default=utils.env('OS_ENDPOINT_TYPE'),
+ help='Select an endpoint type.'
+ ' Valid endpoint types: [admin, public, internal].'
+ ' (Env: OS_ENDPOINT_TYPE)')
+ parser.add_argument(
'--timing',
default=False,
action='store_true',
@@ -254,7 +263,10 @@ class OpenStackShell(app.App):
self.options.project_name = tenant_name
# Do configuration file handling
- cc = cloud_config.OpenStackConfig()
+ # Ignore the default value of endpoint_type. Only if it is set later
+ # will it be used.
+ cc = cloud_config.OpenStackConfig(
+ override_defaults={'endpoint_type': None, })
self.log.debug("defaults: %s", cc.defaults)
self.cloud = cc.get_one_cloud(
diff --git a/openstackclient/tests/common/test_clientmanager.py b/openstackclient/tests/common/test_clientmanager.py
index 4e2f46b4..e86ef509 100644
--- a/openstackclient/tests/common/test_clientmanager.py
+++ b/openstackclient/tests/common/test_clientmanager.py
@@ -54,6 +54,7 @@ class FakeOptions(object):
self.identity_api_version = '2.0'
self.timing = None
self.region_name = None
+ self.endpoint_type = None
self.url = None
self.auth = {}
self.default_domain = 'default'
@@ -123,6 +124,8 @@ class TestClientManager(utils.TestCase):
auth_url=fakes.AUTH_URL,
),
auth_type='v2token',
+ endpoint_type=fakes.ENDPOINT_TYPE,
+ region_name=fakes.REGION_NAME,
),
api_version=API_VERSION,
verify=True
@@ -137,6 +140,14 @@ class TestClientManager(utils.TestCase):
client_manager.auth,
auth_v2.Token,
)
+ self.assertEqual(
+ fakes.ENDPOINT_TYPE,
+ client_manager._endpoint_type,
+ )
+ self.assertEqual(
+ fakes.REGION_NAME,
+ client_manager._region_name,
+ )
self.assertFalse(client_manager._insecure)
self.assertTrue(client_manager._verify)
diff --git a/openstackclient/tests/common/test_utils.py b/openstackclient/tests/common/test_utils.py
index d9f5b7a5..a25a5ba5 100644
--- a/openstackclient/tests/common/test_utils.py
+++ b/openstackclient/tests/common/test_utils.py
@@ -159,6 +159,16 @@ class TestUtils(test_utils.TestCase):
self.assertFalse(utils.wait_for_delete(manager, res_id))
self.assertFalse(mock_sleep.called)
+ def test_build_kwargs_dict_value_set(self):
+ self.assertEqual({'arg_bla': 'bla'},
+ utils.build_kwargs_dict('arg_bla', 'bla'))
+
+ def test_build_kwargs_dict_value_None(self):
+ self.assertEqual({}, utils.build_kwargs_dict('arg_bla', None))
+
+ def test_build_kwargs_dict_value_empty_str(self):
+ self.assertEqual({}, utils.build_kwargs_dict('arg_bla', ''))
+
class NoUniqueMatch(Exception):
pass
diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py
index 323f9543..a9322ec3 100644
--- a/openstackclient/tests/fakes.py
+++ b/openstackclient/tests/fakes.py
@@ -26,6 +26,8 @@ AUTH_URL = "http://0.0.0.0"
USERNAME = "itchy"
PASSWORD = "scratchy"
PROJECT_NAME = "poochie"
+REGION_NAME = "richie"
+ENDPOINT_TYPE = "catchy"
TEST_RESPONSE_DICT = fixture.V2Token(token_id=AUTH_TOKEN,
user_name=USERNAME)
diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py
index b080ae91..674d8345 100644
--- a/openstackclient/tests/test_shell.py
+++ b/openstackclient/tests/test_shell.py
@@ -38,6 +38,7 @@ DEFAULT_REGION_NAME = "ZZ9_Plural_Z_Alpha"
DEFAULT_TOKEN = "token"
DEFAULT_SERVICE_URL = "http://127.0.0.1:8771/v3.0/"
DEFAULT_AUTH_PLUGIN = "v2password"
+DEFAULT_ENDPOINT_TYPE = "internal"
DEFAULT_COMPUTE_API_VERSION = "2"
DEFAULT_IDENTITY_API_VERSION = "2"
@@ -61,6 +62,7 @@ CLOUD_1 = {
},
'region_name': 'occ-cloud',
'donut': 'glazed',
+ 'endpoint_type': 'public',
}
}
}
@@ -104,6 +106,7 @@ global_options = {
'--os-default-domain': (DEFAULT_DOMAIN_NAME, True, True),
'--os-cacert': ('/dev/null', True, True),
'--timing': (True, True, False),
+ '--os-endpoint-type': (DEFAULT_ENDPOINT_TYPE, True, True)
}
auth_options = {
@@ -123,6 +126,7 @@ auth_options = {
'--os-auth-type': ("v2password", True, True),
'--os-token': (DEFAULT_TOKEN, True, True),
'--os-url': (DEFAULT_SERVICE_URL, True, True),
+ '--os-endpoint-type': (DEFAULT_ENDPOINT_TYPE, True, True),
}
@@ -608,6 +612,10 @@ class TestShellCli(TestShell):
'glazed',
_shell.cloud.config['donut'],
)
+ self.assertEqual(
+ 'public',
+ _shell.cloud.config['endpoint_type'],
+ )
@mock.patch("os_client_config.config.OpenStackConfig._load_vendor_file")
@mock.patch("os_client_config.config.OpenStackConfig._load_config_file")
diff --git a/openstackclient/volume/client.py b/openstackclient/volume/client.py
index 1038c407..965c42ec 100644
--- a/openstackclient/volume/client.py
+++ b/openstackclient/volume/client.py
@@ -53,11 +53,16 @@ def make_client(instance):
extensions = [extension.Extension('list_extensions', list_extensions)]
+ # Remember endpoint_type only if it is set
+ kwargs = utils.build_kwargs_dict('endpoint_type',
+ instance._endpoint_type)
+
client = volume_client(
session=instance.session,
extensions=extensions,
http_log_debug=http_log_debug,
region_name=instance._region_name,
+ **kwargs
)
return client