diff --git a/magnumclient/shell.py b/magnumclient/shell.py index 6ff7913f..4eaffa52 100644 --- a/magnumclient/shell.py +++ b/magnumclient/shell.py @@ -26,6 +26,7 @@ from __future__ import print_function import argparse import getpass import logging +import os import sys from oslo.utils import encodeutils @@ -251,6 +252,12 @@ class OpenStackMagnumShell(object): help="Use the auth token cache. Defaults to False " "if env[OS_CACHE] is not set.") + parser.add_argument('--os-region-name', + metavar='', + default=os.environ.get('OS_REGION_NAME'), + help='Region name. Default=env[OS_REGION_NAME].') + + # TODO(mattf) - add get_timings support to Client # parser.add_argument('--timings', # default=False, @@ -506,6 +513,7 @@ class OpenStackMagnumShell(object): project_name=os_tenant_name, auth_url=os_auth_url, service_type=service_type, + region_name=args.os_region_name, magnum_url=bypass_url) args.func(self.cs, args) diff --git a/magnumclient/tests/test_shell.py b/magnumclient/tests/test_shell.py index 893c9782..8790e7e5 100644 --- a/magnumclient/tests/test_shell.py +++ b/magnumclient/tests/test_shell.py @@ -63,6 +63,7 @@ class ParserTest(utils.TestCase): class ShellTest(utils.TestCase): + AUTH_URL = utils.FAKE_ENV['OS_AUTH_URL'] _msg_no_tenant_project = ("You must provide a tenant name or tenant id" " via --os-tenant-name, --os-tenant-id," @@ -216,11 +217,36 @@ class ShellTest(utils.TestCase): self.assertIn('Command-line interface to the OpenStack Magnum API', sys.stdout.getvalue()) + @mock.patch('magnumclient.v1.client.Client') + def _test_main_region(self, command, expected_region_name, mock_client): + self.shell(command) + mock_client.assert_called_once_with( + username='username', api_key='password', + project_id='', project_name='tenant_name', + auth_url=self.AUTH_URL, service_type='container', + region_name=expected_region_name, magnum_url=None) + + def test_main_option_region(self): + self.make_env() + self._test_main_region('--os-region-name=myregion bay-list', + 'myregion') + + def test_main_env_region(self): + fake_env = dict(utils.FAKE_ENV, OS_REGION_NAME='myregion') + self.make_env(fake_env=fake_env) + self._test_main_region('bay-list', 'myregion') + + def test_main_no_region(self): + self.make_env() + self._test_main_region('bay-list', None) + class ShellTestKeystoneV3(ShellTest): + AUTH_URL = 'http://no.where/v3' + def make_env(self, exclude=None, fake_env=FAKE_ENV): if 'OS_AUTH_URL' in fake_env: - fake_env.update({'OS_AUTH_URL': 'http://no.where/v3'}) + fake_env.update({'OS_AUTH_URL': self.AUTH_URL}) env = dict((k, v) for k, v in fake_env.items() if k != exclude) self.useFixture(fixtures.MonkeyPatch('os.environ', env)) diff --git a/magnumclient/v1/client.py b/magnumclient/v1/client.py index e9f4b332..d2df20e5 100644 --- a/magnumclient/v1/client.py +++ b/magnumclient/v1/client.py @@ -30,7 +30,7 @@ class Client(object): def __init__(self, username=None, api_key=None, project_id=None, project_name=None, auth_url=None, magnum_url=None, endpoint_type='publicURL', service_type='container', - input_auth_token=None): + region_name=None, input_auth_token=None): if not input_auth_token: keystone = self.get_keystone_client(username=username, @@ -50,7 +50,8 @@ class Client(object): token=input_auth_token, project_id=project_id, project_name=project_name) - catalog = keystone.service_catalog.get_endpoints(service_type) + catalog = keystone.service_catalog.get_endpoints( + service_type, region_name=region_name) if service_type in catalog: for e_type, endpoint in catalog.get(service_type)[0].items(): if str(e_type).lower() == str(endpoint_type).lower():