Add --os-cloud support
This adds a new option --os-cloud that allows the configuration values
for multiple clouds to be stored in a local file and selected with
a single option.
Internal option names have had 'os_' removed to be comptible with
the options returned from OpenStackConfig().get_one_cloud().
The config file is ~/.config/openstack/clouds.yaml:
Sample
------
clouds:
  devstack:
    auth:
      auth_url: http://192.168.122.10:35357/
      project_name: demo
      username: demo
      password: 0penstack
    region_name: RegionOne
  devstack:
     auth:
       auth_url: http://192.168.122.10:35357/
       project_name: demo
       username: demo
       password: 0penstack
     region_name: RegionOne
Co-Authored-By: Monty Taylor <mordred@inaugust.com>
Change-Id: I4939acf8067e44ffe06a2e26fc28f1adf8985b7d
Depends-On: I45e2550af58aee616ca168d20a557077beeab007
			
			
This commit is contained in:
		| @@ -84,9 +84,17 @@ def base_parser(parser): | ||||
|     """ | ||||
|  | ||||
|     # Global arguments | ||||
|     parser.add_argument( | ||||
|         '--os-cloud', | ||||
|         metavar='<cloud-config-name>', | ||||
|         dest='cloud', | ||||
|         default=env('OS_CLOUD'), | ||||
|         help='Cloud name in clouds.yaml (Env: OS_CLOUD)', | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '--os-region-name', | ||||
|         metavar='<auth-region-name>', | ||||
|         dest='region_name', | ||||
|         default=env('OS_REGION_NAME'), | ||||
|         help='Authentication region name (Env: OS_REGION_NAME)', | ||||
|     ) | ||||
|   | ||||
| @@ -30,6 +30,8 @@ import common | ||||
| from openstackclient.api import object_store_v1 as object_store | ||||
| from openstackclient.identity import client as identity_client | ||||
|  | ||||
| from os_client_config import config as cloud_config | ||||
|  | ||||
|  | ||||
| LOG = logging.getLogger('') | ||||
|  | ||||
| @@ -37,6 +39,15 @@ LOG = logging.getLogger('') | ||||
| def run(opts): | ||||
|     """Run the examples""" | ||||
|  | ||||
|     # Look for configuration file | ||||
|     # To support token-flow we have no required values | ||||
|     # print "options: %s" % self.options | ||||
|     cloud = cloud_config.OpenStackConfig().get_one_cloud( | ||||
|         cloud=opts.cloud, | ||||
|         argparse=opts, | ||||
|     ) | ||||
|     LOG.debug("cloud cfg: %s", cloud.config) | ||||
|  | ||||
|     # Set up certificate verification and CA bundle | ||||
|     # NOTE(dtroyer): This converts from the usual OpenStack way to the single | ||||
|     #                requests argument and is an app-specific thing because | ||||
| @@ -52,13 +63,13 @@ def run(opts): | ||||
|     # The returned session will have a configured auth object | ||||
|     # based on the selected plugin's available options. | ||||
|     # So to do...oh, just go to api.auth.py and look at what it does. | ||||
|     session = common.make_session(opts, verify=verify) | ||||
|     session = common.make_session(cloud, verify=verify) | ||||
|  | ||||
|     # Extract an endpoint | ||||
|     auth_ref = session.auth.get_auth_ref(session) | ||||
|  | ||||
|     if opts.os_url: | ||||
|         endpoint = opts.os_url | ||||
|     if opts.url: | ||||
|         endpoint = opts.url | ||||
|     else: | ||||
|         endpoint = auth_ref.service_catalog.url_for( | ||||
|             service_type='object-store', | ||||
|   | ||||
| @@ -29,6 +29,8 @@ import common | ||||
|  | ||||
| from openstackclient.common import clientmanager | ||||
|  | ||||
| from os_client_config import config as cloud_config | ||||
|  | ||||
|  | ||||
| LOG = logging.getLogger('') | ||||
|  | ||||
| @@ -36,6 +38,16 @@ LOG = logging.getLogger('') | ||||
| def run(opts): | ||||
|     """Run the examples""" | ||||
|  | ||||
|     # Do configuration file handling | ||||
|     cc = cloud_config.OpenStackConfig() | ||||
|     LOG.debug("defaults: %s", cc.defaults) | ||||
|  | ||||
|     cloud = cc.get_one_cloud( | ||||
|         cloud=opts.cloud, | ||||
|         argparse=opts, | ||||
|     ) | ||||
|     LOG.debug("cloud cfg: %s", cloud.config) | ||||
|  | ||||
|     # Loop through extensions to get API versions | ||||
|     # Currently API versions are statically selected.  Once discovery | ||||
|     # is working this can go away... | ||||
| @@ -59,7 +71,7 @@ def run(opts): | ||||
|     # Collect the auth and config options together and give them to | ||||
|     # ClientManager and it will wrangle all of the goons into place. | ||||
|     client_manager = clientmanager.ClientManager( | ||||
|         cli_options=opts, | ||||
|         cli_options=cloud, | ||||
|         verify=verify, | ||||
|         api_version=api_version, | ||||
|     ) | ||||
|   | ||||
| @@ -77,25 +77,27 @@ def select_auth_plugin(options): | ||||
|  | ||||
|     auth_plugin_name = None | ||||
|  | ||||
|     if options.os_auth_type in [plugin.name for plugin in get_plugin_list()]: | ||||
|         # A direct plugin name was given, use it | ||||
|         return options.os_auth_type | ||||
|  | ||||
|     if options.os_url and options.os_token: | ||||
|     # Do the token/url check first as this must override the default | ||||
|     # 'password' set by os-client-config | ||||
|     # Also, url and token are not copied into o-c-c's auth dict (yet?) | ||||
|     if options.auth.get('url', None) and options.auth.get('token', None): | ||||
|         # service token authentication | ||||
|         auth_plugin_name = 'token_endpoint' | ||||
|     elif options.os_username: | ||||
|         if options.os_identity_api_version == '3': | ||||
|     elif options.auth_type in [plugin.name for plugin in PLUGIN_LIST]: | ||||
|         # A direct plugin name was given, use it | ||||
|         auth_plugin_name = options.auth_type | ||||
|     elif options.auth.get('username', None): | ||||
|         if options.identity_api_version == '3': | ||||
|             auth_plugin_name = 'v3password' | ||||
|         elif options.os_identity_api_version == '2.0': | ||||
|         elif options.identity_api_version.startswith('2'): | ||||
|             auth_plugin_name = 'v2password' | ||||
|         else: | ||||
|             # let keystoneclient figure it out itself | ||||
|             auth_plugin_name = 'osc_password' | ||||
|     elif options.os_token: | ||||
|         if options.os_identity_api_version == '3': | ||||
|     elif options.auth.get('token', None): | ||||
|         if options.identity_api_version == '3': | ||||
|             auth_plugin_name = 'v3token' | ||||
|         elif options.os_identity_api_version == '2.0': | ||||
|         elif options.identity_api_version.startswith('2'): | ||||
|             auth_plugin_name = 'v2token' | ||||
|         else: | ||||
|             # let keystoneclient figure it out itself | ||||
| @@ -109,35 +111,27 @@ def select_auth_plugin(options): | ||||
|  | ||||
|  | ||||
| def build_auth_params(auth_plugin_name, cmd_options): | ||||
|     auth_params = {} | ||||
|  | ||||
|     auth_params = dict(cmd_options.auth) | ||||
|     if auth_plugin_name: | ||||
|         LOG.debug('auth_type: %s', auth_plugin_name) | ||||
|         auth_plugin_class = base.get_plugin_class(auth_plugin_name) | ||||
|         plugin_options = auth_plugin_class.get_options() | ||||
|         for option in plugin_options: | ||||
|             option_name = 'os_' + option.dest | ||||
|             LOG.debug('fetching option %s' % option_name) | ||||
|             auth_params[option.dest] = getattr(cmd_options, option_name, None) | ||||
|         # grab tenant from project for v2.0 API compatibility | ||||
|         if auth_plugin_name.startswith("v2"): | ||||
|             auth_params['tenant_id'] = getattr( | ||||
|                 cmd_options, | ||||
|                 'os_project_id', | ||||
|                 None, | ||||
|             ) | ||||
|             auth_params['tenant_name'] = getattr( | ||||
|                 cmd_options, | ||||
|                 'os_project_name', | ||||
|                 None, | ||||
|             ) | ||||
|             if 'project_id' in auth_params: | ||||
|                 auth_params['tenant_id'] = auth_params['project_id'] | ||||
|                 del auth_params['project_id'] | ||||
|             if 'project_name' in auth_params: | ||||
|                 auth_params['tenant_name'] = auth_params['project_name'] | ||||
|                 del auth_params['project_name'] | ||||
|     else: | ||||
|         LOG.debug('no auth_type') | ||||
|         # delay the plugin choice, grab every option | ||||
|         auth_plugin_class = None | ||||
|         plugin_options = set([o.replace('-', '_') for o in get_options_list()]) | ||||
|         for option in plugin_options: | ||||
|             option_name = 'os_' + option | ||||
|             LOG.debug('fetching option %s' % option_name) | ||||
|             auth_params[option] = getattr(cmd_options, option_name, None) | ||||
|             LOG.debug('fetching option %s' % option) | ||||
|             auth_params[option] = getattr(cmd_options.auth, option, None) | ||||
|     return (auth_plugin_class, auth_params) | ||||
|  | ||||
|  | ||||
| @@ -146,15 +140,29 @@ def check_valid_auth_options(options, auth_plugin_name): | ||||
|  | ||||
|     msg = '' | ||||
|     if auth_plugin_name.endswith('password'): | ||||
|         if not options.os_username: | ||||
|             msg += _('Set a username with --os-username or OS_USERNAME\n') | ||||
|         if not options.os_auth_url: | ||||
|             msg += _('Set an authentication URL, with --os-auth-url or' | ||||
|                      ' OS_AUTH_URL\n') | ||||
|         if (not options.os_project_id and not options.os_domain_id and not | ||||
|                 options.os_domain_name and not options.os_project_name): | ||||
|         if not options.auth.get('username', None): | ||||
|             msg += _('Set a username with --os-username, OS_USERNAME,' | ||||
|                      ' or auth.username\n') | ||||
|         if not options.auth.get('auth_url', None): | ||||
|             msg += _('Set an authentication URL, with --os-auth-url,' | ||||
|                      ' OS_AUTH_URL or auth.auth_url\n') | ||||
|         if (not options.auth.get('project_id', None) and not | ||||
|                 options.auth.get('domain_id', None) and not | ||||
|                 options.auth.get('domain_name', None) and not | ||||
|                 options.auth.get('project_name', None)): | ||||
|             msg += _('Set a scope, such as a project or domain, with ' | ||||
|                      '--os-project-name or OS_PROJECT_NAME') | ||||
|                      '--os-project-name, OS_PROJECT_NAME or auth.project_name') | ||||
|     elif auth_plugin_name.endswith('token'): | ||||
|         if not options.auth.get('token', None): | ||||
|             msg += _('Set a token with --os-token, OS_TOKEN or auth.token\n') | ||||
|         if not options.auth.get('auth_url', None): | ||||
|             msg += _('Set a service AUTH_URL, with --os-auth-url, ' | ||||
|                      'OS_AUTH_URL or auth.auth_url\n') | ||||
|     elif auth_plugin_name == 'token_endpoint': | ||||
|         if not options.auth.get('token', None): | ||||
|             msg += _('Set a token with --os-token, OS_TOKEN or auth.token\n') | ||||
|         if not options.auth.get('url', None): | ||||
|             msg += _('Set a service URL, with --os-url, OS_URL or auth.url\n') | ||||
|  | ||||
|     if msg: | ||||
|         raise exc.CommandError('Missing parameter(s): \n%s' % msg) | ||||
| @@ -171,6 +179,7 @@ def build_auth_plugins_option_parser(parser): | ||||
|     parser.add_argument( | ||||
|         '--os-auth-type', | ||||
|         metavar='<auth-type>', | ||||
|         dest='auth_type', | ||||
|         default=utils.env('OS_AUTH_TYPE'), | ||||
|         help='Select an auhentication type. Available types: ' + | ||||
|              ', '.join(available_plugins) + | ||||
| @@ -178,7 +187,7 @@ def build_auth_plugins_option_parser(parser): | ||||
|              ' (Env: OS_AUTH_TYPE)', | ||||
|         choices=available_plugins | ||||
|     ) | ||||
|     # make sure we catch old v2.0 env values | ||||
|     # Maintain compatibility with old tenant env vars | ||||
|     envs = { | ||||
|         'OS_PROJECT_NAME': utils.env( | ||||
|             'OS_PROJECT_NAME', | ||||
| @@ -190,15 +199,20 @@ def build_auth_plugins_option_parser(parser): | ||||
|         ), | ||||
|     } | ||||
|     for o in get_options_list(): | ||||
|         # remove allusion to tenants from v2.0 API | ||||
|         # Remove tenant options from KSC plugins and replace them below | ||||
|         if 'tenant' not in o: | ||||
|             parser.add_argument( | ||||
|                 '--os-' + o, | ||||
|                 metavar='<auth-%s>' % o, | ||||
|                 default=envs.get(OPTIONS_LIST[o]['env'], | ||||
|                                  utils.env(OPTIONS_LIST[o]['env'])), | ||||
|                 help='%s\n(Env: %s)' % (OPTIONS_LIST[o]['help'], | ||||
|                                         OPTIONS_LIST[o]['env']), | ||||
|                 dest=o.replace('-', '_'), | ||||
|                 default=envs.get( | ||||
|                     OPTIONS_LIST[o]['env'], | ||||
|                     utils.env(OPTIONS_LIST[o]['env']), | ||||
|                 ), | ||||
|                 help='%s\n(Env: %s)' % ( | ||||
|                     OPTIONS_LIST[o]['help'], | ||||
|                     OPTIONS_LIST[o]['env'], | ||||
|                 ), | ||||
|             ) | ||||
|     # add tenant-related options for compatibility | ||||
|     # this is deprecated but still used in some tempest tests... | ||||
| @@ -206,14 +220,12 @@ def build_auth_plugins_option_parser(parser): | ||||
|         '--os-tenant-name', | ||||
|         metavar='<auth-tenant-name>', | ||||
|         dest='os_project_name', | ||||
|         default=utils.env('OS_TENANT_NAME'), | ||||
|         help=argparse.SUPPRESS, | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         '--os-tenant-id', | ||||
|         metavar='<auth-tenant-id>', | ||||
|         dest='os_project_id', | ||||
|         default=utils.env('OS_TENANT_ID'), | ||||
|         help=argparse.SUPPRESS, | ||||
|     ) | ||||
|     return parser | ||||
|   | ||||
| @@ -58,7 +58,7 @@ class ClientManager(object): | ||||
|  | ||||
|     def __init__( | ||||
|         self, | ||||
|         cli_options, | ||||
|         cli_options=None, | ||||
|         api_version=None, | ||||
|         verify=True, | ||||
|         pw_func=None, | ||||
| @@ -82,8 +82,8 @@ class ClientManager(object): | ||||
|         self._cli_options = cli_options | ||||
|         self._api_version = api_version | ||||
|         self._pw_callback = pw_func | ||||
|         self._url = self._cli_options.os_url | ||||
|         self._region_name = self._cli_options.os_region_name | ||||
|         self._url = self._cli_options.auth.get('url', None) | ||||
|         self._region_name = self._cli_options.region_name | ||||
|  | ||||
|         self.timing = self._cli_options.timing | ||||
|  | ||||
| @@ -121,7 +121,7 @@ class ClientManager(object): | ||||
|         # Horrible hack alert...must handle prompt for null password if | ||||
|         # password auth is requested. | ||||
|         if (self.auth_plugin_name.endswith('password') and | ||||
|                 not self._cli_options.os_password): | ||||
|                 not self._cli_options.auth.get('password', None)): | ||||
|             self._cli_options.os_password = self._pw_callback() | ||||
|  | ||||
|         (auth_plugin, self._auth_params) = auth.build_auth_params( | ||||
| @@ -129,13 +129,15 @@ class ClientManager(object): | ||||
|             self._cli_options, | ||||
|         ) | ||||
|  | ||||
|         default_domain = self._cli_options.os_default_domain | ||||
|         # TODO(mordred): This is a usability improvement that's broadly useful | ||||
|         # We should port it back up into os-client-config. | ||||
|         default_domain = self._cli_options.default_domain | ||||
|         # NOTE(stevemar): If PROJECT_DOMAIN_ID or PROJECT_DOMAIN_NAME is | ||||
|         # present, then do not change the behaviour. Otherwise, set the | ||||
|         # PROJECT_DOMAIN_ID to 'OS_DEFAULT_DOMAIN' for better usability. | ||||
|         if (self._api_version.get('identity') == '3' and | ||||
|             not self._auth_params.get('project_domain_id') and | ||||
|                 not self._auth_params.get('project_domain_name')): | ||||
|             not self._auth_params.get('project_domain_id', None) and | ||||
|                 not self._auth_params.get('project_domain_name', None)): | ||||
|             self._auth_params['project_domain_id'] = default_domain | ||||
|  | ||||
|         # NOTE(stevemar): If USER_DOMAIN_ID or USER_DOMAIN_NAME is present, | ||||
| @@ -143,8 +145,8 @@ class ClientManager(object): | ||||
|         # to 'OS_DEFAULT_DOMAIN' for better usability. | ||||
|         if (self._api_version.get('identity') == '3' and | ||||
|             self.auth_plugin_name.endswith('password') and | ||||
|             not self._auth_params.get('user_domain_id') and | ||||
|                 not self._auth_params.get('user_domain_name')): | ||||
|             not self._auth_params.get('user_domain_id', None) and | ||||
|                 not self._auth_params.get('user_domain_name', None)): | ||||
|             self._auth_params['user_domain_id'] = default_domain | ||||
|  | ||||
|         # For compatibility until all clients can be updated | ||||
|   | ||||
| @@ -33,6 +33,8 @@ from openstackclient.common import exceptions as exc | ||||
| from openstackclient.common import timing | ||||
| from openstackclient.common import utils | ||||
|  | ||||
| from os_client_config import config as cloud_config | ||||
|  | ||||
|  | ||||
| DEFAULT_DOMAIN = 'default' | ||||
|  | ||||
| @@ -86,10 +88,6 @@ class OpenStackShell(app.App): | ||||
|         # Until we have command line arguments parsed, dump any stack traces | ||||
|         self.dump_stack_trace = True | ||||
|  | ||||
|         # This is instantiated in initialize_app() only when using | ||||
|         # password flow auth | ||||
|         self.auth_client = None | ||||
|  | ||||
|         # Assume TLS host certificate verification is enabled | ||||
|         self.verify = True | ||||
|  | ||||
| @@ -165,10 +163,19 @@ class OpenStackShell(app.App): | ||||
|             description, | ||||
|             version) | ||||
|  | ||||
|         # service token auth argument | ||||
|         parser.add_argument( | ||||
|             '--os-cloud', | ||||
|             metavar='<cloud-config-name>', | ||||
|             dest='cloud', | ||||
|             default=utils.env('OS_CLOUD'), | ||||
|             help='Cloud name in clouds.yaml (Env: OS_CLOUD)', | ||||
|         ) | ||||
|         # Global arguments | ||||
|         parser.add_argument( | ||||
|             '--os-region-name', | ||||
|             metavar='<auth-region-name>', | ||||
|             dest='region_name', | ||||
|             default=utils.env('OS_REGION_NAME'), | ||||
|             help='Authentication region name (Env: OS_REGION_NAME)') | ||||
|         parser.add_argument( | ||||
| @@ -213,8 +220,43 @@ class OpenStackShell(app.App): | ||||
|         * authenticate against Identity if requested | ||||
|         """ | ||||
|  | ||||
|         # Parent __init__ parses argv into self.options | ||||
|         super(OpenStackShell, self).initialize_app(argv) | ||||
|  | ||||
|         # Resolve the verify/insecure exclusive pair here as cloud_config | ||||
|         # doesn't know about verify | ||||
|         self.options.insecure = ( | ||||
|             self.options.insecure and not self.options.verify | ||||
|         ) | ||||
|  | ||||
|         # Set the default plugin to token_endpoint if rl and token are given | ||||
|         if (self.options.url and self.options.token): | ||||
|             # Use service token authentication | ||||
|             cloud_config.set_default('auth_type', 'token_endpoint') | ||||
|         else: | ||||
|             cloud_config.set_default('auth_type', 'osc_password') | ||||
|         self.log.debug("options: %s", self.options) | ||||
|  | ||||
|         # Do configuration file handling | ||||
|         cc = cloud_config.OpenStackConfig() | ||||
|         self.log.debug("defaults: %s", cc.defaults) | ||||
|  | ||||
|         self.cloud = cc.get_one_cloud( | ||||
|             cloud=self.options.cloud, | ||||
|             argparse=self.options, | ||||
|         ) | ||||
|         self.log.debug("cloud cfg: %s", self.cloud.config) | ||||
|  | ||||
|         # Set up client TLS | ||||
|         cacert = self.cloud.cacert | ||||
|         if cacert: | ||||
|             self.verify = cacert | ||||
|         else: | ||||
|             self.verify = not getattr(self.cloud.config, 'insecure', False) | ||||
|  | ||||
|         # Neutralize verify option | ||||
|         self.options.verify = None | ||||
|  | ||||
|         # Save default domain | ||||
|         self.default_domain = self.options.os_default_domain | ||||
|  | ||||
| @@ -260,14 +302,8 @@ class OpenStackShell(app.App): | ||||
|         # Handle deferred help and exit | ||||
|         self.print_help_if_requested() | ||||
|  | ||||
|         # Set up common client session | ||||
|         if self.options.os_cacert: | ||||
|             self.verify = self.options.os_cacert | ||||
|         else: | ||||
|             self.verify = not self.options.insecure | ||||
|  | ||||
|         self.client_manager = clientmanager.ClientManager( | ||||
|             cli_options=self.options, | ||||
|             cli_options=self.cloud, | ||||
|             verify=self.verify, | ||||
|             api_version=self.api_version, | ||||
|             pw_func=prompt_for_password, | ||||
|   | ||||
| @@ -48,13 +48,14 @@ class Container(object): | ||||
| class FakeOptions(object): | ||||
|     def __init__(self, **kwargs): | ||||
|         for option in auth.OPTIONS_LIST: | ||||
|             setattr(self, 'os_' + option.replace('-', '_'), None) | ||||
|         self.os_auth_type = None | ||||
|         self.os_identity_api_version = '2.0' | ||||
|             setattr(self, option.replace('-', '_'), None) | ||||
|         self.auth_type = None | ||||
|         self.identity_api_version = '2.0' | ||||
|         self.timing = None | ||||
|         self.os_region_name = None | ||||
|         self.os_url = None | ||||
|         self.os_default_domain = 'default' | ||||
|         self.region_name = None | ||||
|         self.url = None | ||||
|         self.auth = {} | ||||
|         self.default_domain = 'default' | ||||
|         self.__dict__.update(kwargs) | ||||
|  | ||||
|  | ||||
| @@ -86,9 +87,11 @@ class TestClientManager(utils.TestCase): | ||||
|  | ||||
|         client_manager = clientmanager.ClientManager( | ||||
|             cli_options=FakeOptions( | ||||
|                 os_token=fakes.AUTH_TOKEN, | ||||
|                 os_url=fakes.AUTH_URL, | ||||
|                 os_auth_type='token_endpoint', | ||||
|                 auth_type='token_endpoint', | ||||
|                 auth=dict( | ||||
|                     token=fakes.AUTH_TOKEN, | ||||
|                     url=fakes.AUTH_URL, | ||||
|                 ), | ||||
|             ), | ||||
|             api_version=API_VERSION, | ||||
|             verify=True | ||||
| @@ -114,9 +117,11 @@ class TestClientManager(utils.TestCase): | ||||
|  | ||||
|         client_manager = clientmanager.ClientManager( | ||||
|             cli_options=FakeOptions( | ||||
|                 os_token=fakes.AUTH_TOKEN, | ||||
|                 os_auth_url=fakes.AUTH_URL, | ||||
|                 os_auth_type='v2token', | ||||
|                 auth=dict( | ||||
|                     token=fakes.AUTH_TOKEN, | ||||
|                     auth_url=fakes.AUTH_URL, | ||||
|                 ), | ||||
|                 auth_type='v2token', | ||||
|             ), | ||||
|             api_version=API_VERSION, | ||||
|             verify=True | ||||
| @@ -138,10 +143,12 @@ class TestClientManager(utils.TestCase): | ||||
|  | ||||
|         client_manager = clientmanager.ClientManager( | ||||
|             cli_options=FakeOptions( | ||||
|                 os_auth_url=fakes.AUTH_URL, | ||||
|                 os_username=fakes.USERNAME, | ||||
|                 os_password=fakes.PASSWORD, | ||||
|                 os_project_name=fakes.PROJECT_NAME, | ||||
|                 auth=dict( | ||||
|                     auth_url=fakes.AUTH_URL, | ||||
|                     username=fakes.USERNAME, | ||||
|                     password=fakes.PASSWORD, | ||||
|                     project_name=fakes.PROJECT_NAME, | ||||
|                 ), | ||||
|             ), | ||||
|             api_version=API_VERSION, | ||||
|             verify=False, | ||||
| @@ -198,11 +205,13 @@ class TestClientManager(utils.TestCase): | ||||
|  | ||||
|         client_manager = clientmanager.ClientManager( | ||||
|             cli_options=FakeOptions( | ||||
|                 os_auth_url=fakes.AUTH_URL, | ||||
|                 os_username=fakes.USERNAME, | ||||
|                 os_password=fakes.PASSWORD, | ||||
|                 os_project_name=fakes.PROJECT_NAME, | ||||
|                 os_auth_type='v2password', | ||||
|                 auth=dict( | ||||
|                     auth_url=fakes.AUTH_URL, | ||||
|                     username=fakes.USERNAME, | ||||
|                     password=fakes.PASSWORD, | ||||
|                     project_name=fakes.PROJECT_NAME, | ||||
|                 ), | ||||
|                 auth_type='v2password', | ||||
|             ), | ||||
|             api_version=API_VERSION, | ||||
|             verify='cafile', | ||||
| @@ -214,8 +223,8 @@ class TestClientManager(utils.TestCase): | ||||
|         self.assertEqual('cafile', client_manager._cacert) | ||||
|  | ||||
|     def _select_auth_plugin(self, auth_params, api_version, auth_plugin_name): | ||||
|         auth_params['os_auth_type'] = auth_plugin_name | ||||
|         auth_params['os_identity_api_version'] = api_version | ||||
|         auth_params['auth_type'] = auth_plugin_name | ||||
|         auth_params['identity_api_version'] = api_version | ||||
|         client_manager = clientmanager.ClientManager( | ||||
|             cli_options=FakeOptions(**auth_params), | ||||
|             api_version=API_VERSION, | ||||
| @@ -230,19 +239,33 @@ class TestClientManager(utils.TestCase): | ||||
|  | ||||
|     def test_client_manager_select_auth_plugin(self): | ||||
|         # test token auth | ||||
|         params = dict(os_token=fakes.AUTH_TOKEN, | ||||
|                       os_auth_url=fakes.AUTH_URL) | ||||
|         params = dict( | ||||
|             auth=dict( | ||||
|                 auth_url=fakes.AUTH_URL, | ||||
|                 token=fakes.AUTH_TOKEN, | ||||
|             ), | ||||
|         ) | ||||
|         self._select_auth_plugin(params, '2.0', 'v2token') | ||||
|         self._select_auth_plugin(params, '3', 'v3token') | ||||
|         self._select_auth_plugin(params, 'XXX', 'token') | ||||
|         # test token/endpoint auth | ||||
|         params = dict(os_token=fakes.AUTH_TOKEN, os_url='test') | ||||
|         params = dict( | ||||
|             auth_plugin='token_endpoint', | ||||
|             auth=dict( | ||||
|                 url='test', | ||||
|                 token=fakes.AUTH_TOKEN, | ||||
|             ), | ||||
|         ) | ||||
|         self._select_auth_plugin(params, 'XXX', 'token_endpoint') | ||||
|         # test password auth | ||||
|         params = dict(os_auth_url=fakes.AUTH_URL, | ||||
|                       os_username=fakes.USERNAME, | ||||
|                       os_password=fakes.PASSWORD, | ||||
|                       os_project_name=fakes.PROJECT_NAME) | ||||
|         params = dict( | ||||
|             auth=dict( | ||||
|                 auth_url=fakes.AUTH_URL, | ||||
|                 username=fakes.USERNAME, | ||||
|                 password=fakes.PASSWORD, | ||||
|                 project_name=fakes.PROJECT_NAME, | ||||
|             ), | ||||
|         ) | ||||
|         self._select_auth_plugin(params, '2.0', 'v2password') | ||||
|         self._select_auth_plugin(params, '3', 'v3password') | ||||
|         self._select_auth_plugin(params, 'XXX', 'password') | ||||
|   | ||||
| @@ -82,34 +82,62 @@ class TestShell(utils.TestCase): | ||||
|             fake_execute(_shell, _cmd) | ||||
|  | ||||
|             self.app.assert_called_with(["list", "project"]) | ||||
|             self.assertEqual(default_args["auth_url"], | ||||
|                              _shell.options.os_auth_url) | ||||
|             self.assertEqual(default_args["project_id"], | ||||
|                              _shell.options.os_project_id) | ||||
|             self.assertEqual(default_args["project_name"], | ||||
|                              _shell.options.os_project_name) | ||||
|             self.assertEqual(default_args["domain_id"], | ||||
|                              _shell.options.os_domain_id) | ||||
|             self.assertEqual(default_args["domain_name"], | ||||
|                              _shell.options.os_domain_name) | ||||
|             self.assertEqual(default_args["user_domain_id"], | ||||
|                              _shell.options.os_user_domain_id) | ||||
|             self.assertEqual(default_args["user_domain_name"], | ||||
|                              _shell.options.os_user_domain_name) | ||||
|             self.assertEqual(default_args["project_domain_id"], | ||||
|                              _shell.options.os_project_domain_id) | ||||
|             self.assertEqual(default_args["project_domain_name"], | ||||
|                              _shell.options.os_project_domain_name) | ||||
|             self.assertEqual(default_args["username"], | ||||
|                              _shell.options.os_username) | ||||
|             self.assertEqual(default_args["password"], | ||||
|                              _shell.options.os_password) | ||||
|             self.assertEqual(default_args["region_name"], | ||||
|                              _shell.options.os_region_name) | ||||
|             self.assertEqual(default_args["trust_id"], | ||||
|                              _shell.options.os_trust_id) | ||||
|             self.assertEqual(default_args['auth_type'], | ||||
|                              _shell.options.os_auth_type) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("auth_url", ''), | ||||
|                 _shell.options.auth_url, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("project_id", ''), | ||||
|                 _shell.options.project_id, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("project_name", ''), | ||||
|                 _shell.options.project_name, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("domain_id", ''), | ||||
|                 _shell.options.domain_id, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("domain_name", ''), | ||||
|                 _shell.options.domain_name, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("user_domain_id", ''), | ||||
|                 _shell.options.user_domain_id, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("user_domain_name", ''), | ||||
|                 _shell.options.user_domain_name, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("project_domain_id", ''), | ||||
|                 _shell.options.project_domain_id, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("project_domain_name", ''), | ||||
|                 _shell.options.project_domain_name, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("username", ''), | ||||
|                 _shell.options.username, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("password", ''), | ||||
|                 _shell.options.password, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("region_name", ''), | ||||
|                 _shell.options.region_name, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("trust_id", ''), | ||||
|                 _shell.options.trust_id, | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get('auth_type', ''), | ||||
|                 _shell.options.auth_type, | ||||
|             ) | ||||
|  | ||||
|     def _assert_token_auth(self, cmd_options, default_args): | ||||
|         with mock.patch("openstackclient.shell.OpenStackShell.initialize_app", | ||||
| @@ -118,9 +146,34 @@ class TestShell(utils.TestCase): | ||||
|             fake_execute(_shell, _cmd) | ||||
|  | ||||
|             self.app.assert_called_with(["list", "role"]) | ||||
|             self.assertEqual(default_args["os_token"], _shell.options.os_token) | ||||
|             self.assertEqual(default_args["os_auth_url"], | ||||
|                              _shell.options.os_auth_url) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("token", ''), | ||||
|                 _shell.options.token, | ||||
|                 "token" | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("auth_url", ''), | ||||
|                 _shell.options.auth_url, | ||||
|                 "auth_url" | ||||
|             ) | ||||
|  | ||||
|     def _assert_token_endpoint_auth(self, cmd_options, default_args): | ||||
|         with mock.patch("openstackclient.shell.OpenStackShell.initialize_app", | ||||
|                         self.app): | ||||
|             _shell, _cmd = make_shell(), cmd_options + " list role" | ||||
|             fake_execute(_shell, _cmd) | ||||
|  | ||||
|             self.app.assert_called_with(["list", "role"]) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("token", ''), | ||||
|                 _shell.options.token, | ||||
|                 "token", | ||||
|             ) | ||||
|             self.assertEqual( | ||||
|                 default_args.get("url", ''), | ||||
|                 _shell.options.url, | ||||
|                 "url", | ||||
|             ) | ||||
|  | ||||
|     def _assert_cli(self, cmd_options, default_args): | ||||
|         with mock.patch("openstackclient.shell.OpenStackShell.initialize_app", | ||||
| @@ -178,301 +231,159 @@ class TestShellPasswordAuth(TestShell): | ||||
|         flag = "--os-auth-url " + DEFAULT_AUTH_URL | ||||
|         kwargs = { | ||||
|             "auth_url": DEFAULT_AUTH_URL, | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_project_id_flow(self): | ||||
|         flag = "--os-project-id " + DEFAULT_PROJECT_ID | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": DEFAULT_PROJECT_ID, | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_project_name_flow(self): | ||||
|         flag = "--os-project-name " + DEFAULT_PROJECT_NAME | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": DEFAULT_PROJECT_NAME, | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_domain_id_flow(self): | ||||
|         flag = "--os-domain-id " + DEFAULT_DOMAIN_ID | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": DEFAULT_DOMAIN_ID, | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_domain_name_flow(self): | ||||
|         flag = "--os-domain-name " + DEFAULT_DOMAIN_NAME | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": DEFAULT_DOMAIN_NAME, | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_user_domain_id_flow(self): | ||||
|         flag = "--os-user-domain-id " + DEFAULT_USER_DOMAIN_ID | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": DEFAULT_USER_DOMAIN_ID, | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_user_domain_name_flow(self): | ||||
|         flag = "--os-user-domain-name " + DEFAULT_USER_DOMAIN_NAME | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": DEFAULT_USER_DOMAIN_NAME, | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_project_domain_id_flow(self): | ||||
|         flag = "--os-project-domain-id " + DEFAULT_PROJECT_DOMAIN_ID | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": DEFAULT_PROJECT_DOMAIN_ID, | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_project_domain_name_flow(self): | ||||
|         flag = "--os-project-domain-name " + DEFAULT_PROJECT_DOMAIN_NAME | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": DEFAULT_PROJECT_DOMAIN_NAME, | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_username_flow(self): | ||||
|         flag = "--os-username " + DEFAULT_USERNAME | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": DEFAULT_USERNAME, | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_password_flow(self): | ||||
|         flag = "--os-password " + DEFAULT_PASSWORD | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": DEFAULT_PASSWORD, | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_region_name_flow(self): | ||||
|         flag = "--os-region-name " + DEFAULT_REGION_NAME | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": DEFAULT_REGION_NAME, | ||||
|             "trust_id": "", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_trust_id_flow(self): | ||||
|         flag = "--os-trust-id " + "1234" | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "1234", | ||||
|             "auth_type": "", | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_auth_type_flow(self): | ||||
|         flag = "--os-auth-type " + "v2password" | ||||
|         kwargs = { | ||||
|             "auth_url": "", | ||||
|             "project_id": "", | ||||
|             "project_name": "", | ||||
|             "domain_id": "", | ||||
|             "domain_name": "", | ||||
|             "user_domain_id": "", | ||||
|             "user_domain_name": "", | ||||
|             "project_domain_id": "", | ||||
|             "project_domain_name": "", | ||||
|             "username": "", | ||||
|             "password": "", | ||||
|             "region_name": "", | ||||
|             "trust_id": "", | ||||
|             "auth_type": DEFAULT_AUTH_PLUGIN | ||||
|         } | ||||
|         self._assert_password_auth(flag, kwargs) | ||||
|  | ||||
|  | ||||
| class TestShellTokenAuth(TestShell): | ||||
|     def test_only_token(self): | ||||
|         flag = "--os-token " + DEFAULT_TOKEN | ||||
|         kwargs = { | ||||
|             "token": DEFAULT_TOKEN, | ||||
|             "auth_url": '', | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_auth_url(self): | ||||
|         flag = "--os-auth-url " + DEFAULT_AUTH_URL | ||||
|         kwargs = { | ||||
|             "token": '', | ||||
|             "auth_url": DEFAULT_AUTH_URL, | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_empty_auth(self): | ||||
|         os.environ = {} | ||||
|         flag = "" | ||||
|         kwargs = {} | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|  | ||||
| class TestShellTokenAuthEnv(TestShell): | ||||
|     def setUp(self): | ||||
|         super(TestShellTokenAuth, self).setUp() | ||||
|         super(TestShellTokenAuthEnv, self).setUp() | ||||
|         env = { | ||||
|             "OS_TOKEN": DEFAULT_TOKEN, | ||||
|             "OS_AUTH_URL": DEFAULT_SERVICE_URL, | ||||
|             "OS_AUTH_URL": DEFAULT_AUTH_URL, | ||||
|         } | ||||
|         self.orig_env, os.environ = os.environ, env.copy() | ||||
|  | ||||
|     def tearDown(self): | ||||
|         super(TestShellTokenAuth, self).tearDown() | ||||
|         super(TestShellTokenAuthEnv, self).tearDown() | ||||
|         os.environ = self.orig_env | ||||
|  | ||||
|     def test_default_auth(self): | ||||
|     def test_env(self): | ||||
|         flag = "" | ||||
|         kwargs = { | ||||
|             "os_token": DEFAULT_TOKEN, | ||||
|             "os_auth_url": DEFAULT_SERVICE_URL | ||||
|             "token": DEFAULT_TOKEN, | ||||
|             "auth_url": DEFAULT_AUTH_URL, | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_token(self): | ||||
|         flag = "--os-token xyzpdq" | ||||
|         kwargs = { | ||||
|             "token": "xyzpdq", | ||||
|             "auth_url": DEFAULT_AUTH_URL, | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_auth_url(self): | ||||
|         flag = "--os-auth-url http://cloud.local:555" | ||||
|         kwargs = { | ||||
|             "token": DEFAULT_TOKEN, | ||||
|             "auth_url": "http://cloud.local:555", | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
| @@ -480,8 +391,82 @@ class TestShellTokenAuth(TestShell): | ||||
|         os.environ = {} | ||||
|         flag = "" | ||||
|         kwargs = { | ||||
|             "os_token": "", | ||||
|             "os_auth_url": "" | ||||
|             "token": '', | ||||
|             "auth_url": '', | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|  | ||||
| class TestShellTokenEndpointAuth(TestShell): | ||||
|     def test_only_token(self): | ||||
|         flag = "--os-token " + DEFAULT_TOKEN | ||||
|         kwargs = { | ||||
|             "token": DEFAULT_TOKEN, | ||||
|             "url": '', | ||||
|         } | ||||
|         self._assert_token_endpoint_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_url(self): | ||||
|         flag = "--os-url " + DEFAULT_SERVICE_URL | ||||
|         kwargs = { | ||||
|             "token": '', | ||||
|             "url": DEFAULT_SERVICE_URL, | ||||
|         } | ||||
|         self._assert_token_endpoint_auth(flag, kwargs) | ||||
|  | ||||
|     def test_empty_auth(self): | ||||
|         os.environ = {} | ||||
|         flag = "" | ||||
|         kwargs = { | ||||
|             "token": '', | ||||
|             "auth_url": '', | ||||
|         } | ||||
|         self._assert_token_endpoint_auth(flag, kwargs) | ||||
|  | ||||
|  | ||||
| class TestShellTokenEndpointAuthEnv(TestShell): | ||||
|     def setUp(self): | ||||
|         super(TestShellTokenEndpointAuthEnv, self).setUp() | ||||
|         env = { | ||||
|             "OS_TOKEN": DEFAULT_TOKEN, | ||||
|             "OS_URL": DEFAULT_SERVICE_URL, | ||||
|         } | ||||
|         self.orig_env, os.environ = os.environ, env.copy() | ||||
|  | ||||
|     def tearDown(self): | ||||
|         super(TestShellTokenEndpointAuthEnv, self).tearDown() | ||||
|         os.environ = self.orig_env | ||||
|  | ||||
|     def test_env(self): | ||||
|         flag = "" | ||||
|         kwargs = { | ||||
|             "token": DEFAULT_TOKEN, | ||||
|             "url": DEFAULT_SERVICE_URL, | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_token(self): | ||||
|         flag = "--os-token xyzpdq" | ||||
|         kwargs = { | ||||
|             "token": "xyzpdq", | ||||
|             "url": DEFAULT_SERVICE_URL, | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_only_url(self): | ||||
|         flag = "--os-url http://cloud.local:555" | ||||
|         kwargs = { | ||||
|             "token": DEFAULT_TOKEN, | ||||
|             "url": "http://cloud.local:555", | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|     def test_empty_auth(self): | ||||
|         os.environ = {} | ||||
|         flag = "" | ||||
|         kwargs = { | ||||
|             "token": '', | ||||
|             "url": '', | ||||
|         } | ||||
|         self._assert_token_auth(flag, kwargs) | ||||
|  | ||||
|   | ||||
| @@ -7,6 +7,7 @@ six>=1.9.0 | ||||
| Babel>=1.3 | ||||
| cliff>=1.10.0  # Apache-2.0 | ||||
| cliff-tablib>=1.0 | ||||
| os-client-config | ||||
| oslo.config>=1.9.3  # Apache-2.0 | ||||
| oslo.i18n>=1.5.0  # Apache-2.0 | ||||
| oslo.utils>=1.4.0                       # Apache-2.0 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Dean Troyer
					Dean Troyer