Add --os-endpoint-type cli optional argument
User should be able to specify the endpoint type through a CLI optional argument/ENV variable setting. We will name this new optional argument: --os-endpoint-type (Env: OS_ENDPOINT_TYPE) and based on the value given, the service API will use that specific endpoint type. Possible values: public, admin, internal. DocImpact Closes-Bug: #1454392 Change-Id: Ife3d4e46b44c0ddcd712b1130e27e362545a9a29
This commit is contained in:
parent
f5cbdb7523
commit
13570dedb1
@ -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
|
||||
|
||||
@ -181,18 +182,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
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -208,6 +208,15 @@ class OpenStackShell(app.App):
|
||||
help='Default domain ID, default=' +
|
||||
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,
|
||||
@ -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(
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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")
|
||||
|
Loading…
x
Reference in New Issue
Block a user