diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/identity/v2_0/catalog.py | 4 | ||||
| -rw-r--r-- | openstackclient/identity/v3/catalog.py | 2 | ||||
| -rw-r--r-- | openstackclient/identity/v3/identity_provider.py | 3 | ||||
| -rw-r--r-- | openstackclient/identity/v3/service_provider.py | 3 | ||||
| -rw-r--r-- | openstackclient/shell.py | 5 | ||||
| -rw-r--r-- | openstackclient/tests/compute/v2/fakes.py | 59 | ||||
| -rw-r--r-- | openstackclient/tests/compute/v2/test_service.py | 115 | ||||
| -rw-r--r-- | openstackclient/tests/fakes.py | 4 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v2_0/test_catalog.py | 16 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v3/test_catalog.py | 11 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v3/test_identity_provider.py | 1 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v3/test_service_provider.py | 1 | ||||
| -rw-r--r-- | openstackclient/tests/volume/v2/fakes.py | 38 | ||||
| -rw-r--r-- | openstackclient/tests/volume/v2/test_volume.py | 21 |
14 files changed, 193 insertions, 90 deletions
diff --git a/openstackclient/identity/v2_0/catalog.py b/openstackclient/identity/v2_0/catalog.py index 669b04f3..53a6fe34 100644 --- a/openstackclient/identity/v2_0/catalog.py +++ b/openstackclient/identity/v2_0/catalog.py @@ -25,7 +25,9 @@ def _format_endpoints(eps=None): return "" ret = '' for index, ep in enumerate(eps): - region = eps[index].get('region', '<none>') + region = eps[index].get('region') + if region is None: + region = '<none>' ret += region + '\n' for endpoint_type in ['publicURL', 'internalURL', 'adminURL']: url = eps[index].get(endpoint_type) diff --git a/openstackclient/identity/v3/catalog.py b/openstackclient/identity/v3/catalog.py index 38a57d90..78d71f59 100644 --- a/openstackclient/identity/v3/catalog.py +++ b/openstackclient/identity/v3/catalog.py @@ -25,7 +25,7 @@ def _format_endpoints(eps=None): return "" ret = '' for ep in eps: - region = ep.get('region_id') or ep.get('region', '<none>') + region = ep.get('region_id') or ep.get('region') or '<none>' ret += region + '\n' ret += " %s: %s\n" % (ep['interface'], ep['url']) return ret diff --git a/openstackclient/identity/v3/identity_provider.py b/openstackclient/identity/v3/identity_provider.py index 276a7f57..39f440f4 100644 --- a/openstackclient/identity/v3/identity_provider.py +++ b/openstackclient/identity/v3/identity_provider.py @@ -214,7 +214,8 @@ class ShowIdentityProvider(command.ShowOne): identity_client = self.app.client_manager.identity idp = utils.find_resource( identity_client.federation.identity_providers, - parsed_args.identity_provider) + parsed_args.identity_provider, + id=parsed_args.identity_provider) idp._info.pop('links', None) remote_ids = utils.format_list(idp._info.pop('remote_ids', [])) diff --git a/openstackclient/identity/v3/service_provider.py b/openstackclient/identity/v3/service_provider.py index e3a22ebb..8b433b4d 100644 --- a/openstackclient/identity/v3/service_provider.py +++ b/openstackclient/identity/v3/service_provider.py @@ -192,7 +192,8 @@ class ShowServiceProvider(command.ShowOne): service_client = self.app.client_manager.identity service_provider = utils.find_resource( service_client.federation.service_providers, - parsed_args.service_provider) + parsed_args.service_provider, + id=parsed_args.service_provider) service_provider._info.pop('links', None) return zip(*sorted(six.iteritems(service_provider._info))) diff --git a/openstackclient/shell.py b/openstackclient/shell.py index b96fb089..9968d73f 100644 --- a/openstackclient/shell.py +++ b/openstackclient/shell.py @@ -250,6 +250,11 @@ class OpenStackShell(app.App): action='store_true', help="Print API call timing info", ) + parser.add_argument( + '--enable-beta-commands', + action='store_true', + help="Enable beta commands which are subject to change", + ) # osprofiler HMAC key argument if osprofiler_profiler: diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py index 70fc386f..62a46b1d 100644 --- a/openstackclient/tests/compute/v2/fakes.py +++ b/openstackclient/tests/compute/v2/fakes.py @@ -76,17 +76,6 @@ QUOTA = { QUOTA_columns = tuple(sorted(QUOTA)) QUOTA_data = tuple(QUOTA[x] for x in sorted(QUOTA)) -service_host = 'host_test' -service_binary = 'compute_test' -service_status = 'enabled' -service_disabled_reason = 'earthquake' -SERVICE = { - 'host': service_host, - 'binary': service_binary, - 'status': service_status, - 'disabled_reason': service_disabled_reason, -} - class FakeAggregate(object): """Fake one aggregate.""" @@ -523,6 +512,54 @@ class FakeServer(object): return mock.MagicMock(side_effect=servers) +class FakeService(object): + """Fake one or more services.""" + + @staticmethod + def create_one_service(attrs=None): + """Create a fake service. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A FakeResource object, with id, name, ram, vcpus, properties + """ + attrs = attrs or {} + + # Set default attributes. + service_info = { + 'host': 'host-' + uuid.uuid4().hex, + 'binary': 'binary-' + uuid.uuid4().hex, + 'status': 'enabled', + 'disabled_reason': 'earthquake', + } + + # Overwrite default attributes. + service_info.update(attrs) + + service = fakes.FakeResource(info=copy.deepcopy(service_info), + loaded=True) + + return service + + @staticmethod + def create_services(attrs=None, count=2): + """Create multiple fake services. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of services to fake + :return: + A list of FakeResource objects faking the services + """ + services = [] + for i in range(0, count): + services.append(FakeService.create_one_service(attrs)) + + return services + + class FakeFlavor(object): """Fake one or more flavors.""" diff --git a/openstackclient/tests/compute/v2/test_service.py b/openstackclient/tests/compute/v2/test_service.py index db097204..7a5a840f 100644 --- a/openstackclient/tests/compute/v2/test_service.py +++ b/openstackclient/tests/compute/v2/test_service.py @@ -13,12 +13,10 @@ # under the License. # -import copy import mock from openstackclient.compute.v2 import service from openstackclient.tests.compute.v2 import fakes as compute_fakes -from openstackclient.tests import fakes class TestService(compute_fakes.TestComputev2): @@ -36,6 +34,8 @@ class TestServiceDelete(TestService): def setUp(self): super(TestServiceDelete, self).setUp() + self.service = compute_fakes.FakeService.create_one_service() + self.service_mock.delete.return_value = None # Get the command object to test @@ -43,17 +43,17 @@ class TestServiceDelete(TestService): def test_service_delete_no_options(self): arglist = [ - compute_fakes.service_binary, + self.service.binary, ] verifylist = [ - ('service', compute_fakes.service_binary), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.service_mock.delete.assert_called_with( - compute_fakes.service_binary, + self.service.binary, ) self.assertIsNone(result) @@ -63,23 +63,21 @@ class TestServiceList(TestService): def setUp(self): super(TestServiceList, self).setUp() - self.service_mock.list.return_value = [fakes.FakeResource( - None, - copy.deepcopy(compute_fakes.SERVICE), - loaded=True, - )] + self.service = compute_fakes.FakeService.create_one_service() + + self.service_mock.list.return_value = [self.service] # Get the command object to test self.cmd = service.ListService(self.app, None) def test_service_list(self): arglist = [ - '--host', compute_fakes.service_host, - '--service', compute_fakes.service_binary, + '--host', self.service.host, + '--service', self.service.binary, ] verifylist = [ - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -89,22 +87,22 @@ class TestServiceList(TestService): columns, data = self.cmd.take_action(parsed_args) self.service_mock.list.assert_called_with( - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, ) self.assertNotIn("Disabled Reason", columns) - self.assertNotIn(compute_fakes.service_disabled_reason, list(data)[0]) + self.assertNotIn(self.service.disabled_reason, list(data)[0]) def test_service_list_with_long_option(self): arglist = [ - '--host', compute_fakes.service_host, - '--service', compute_fakes.service_binary, + '--host', self.service.host, + '--service', self.service.binary, '--long' ] verifylist = [ - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ('long', True) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -115,7 +113,7 @@ class TestServiceList(TestService): columns, data = self.cmd.take_action(parsed_args) self.assertIn("Disabled Reason", columns) - self.assertIn(compute_fakes.service_disabled_reason, list(data)[0]) + self.assertIn(self.service.disabled_reason, list(data)[0]) class TestServiceSet(TestService): @@ -123,59 +121,52 @@ class TestServiceSet(TestService): def setUp(self): super(TestServiceSet, self).setUp() - self.service_mock.enable.return_value = [fakes.FakeResource( - None, - copy.deepcopy(compute_fakes.SERVICE), - loaded=True, - )] + self.service = compute_fakes.FakeService.create_one_service() - self.service_mock.disable.return_value = [fakes.FakeResource( - None, - copy.deepcopy(compute_fakes.SERVICE), - loaded=True, - )] + self.service_mock.enable.return_value = self.service + self.service_mock.disable.return_value = self.service self.cmd = service.SetService(self.app, None) def test_service_set_enable(self): arglist = [ '--enable', - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, ] verifylist = [ ('enabled', True), - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.service_mock.enable.assert_called_with( - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary ) self.assertIsNone(result) def test_service_set_disable(self): arglist = [ '--disable', - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, ] verifylist = [ ('enabled', False), - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.service_mock.disable.assert_called_with( - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary ) self.assertIsNone(result) @@ -184,22 +175,22 @@ class TestServiceSet(TestService): arglist = [ '--disable', '--disable-reason', reason, - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, ] verifylist = [ ('enabled', False), ('disable_reason', reason), - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.service_mock.disable_log_reason.assert_called_with( - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, reason ) self.assertIsNone(result) @@ -208,14 +199,14 @@ class TestServiceSet(TestService): reason = 'earthquake' arglist = [ '--disable-reason', reason, - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, ] verifylist = [ ('enabled', True), ('disable_reason', reason), - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -226,8 +217,8 @@ class TestServiceSet(TestService): mock_log.assert_called_once_with(msg) self.service_mock.enable.assert_called_with( - compute_fakes.service_host, - compute_fakes.service_binary + self.service.host, + self.service.binary ) self.assertIsNone(result) @@ -236,14 +227,14 @@ class TestServiceSet(TestService): arglist = [ '--enable', '--disable-reason', reason, - compute_fakes.service_host, - compute_fakes.service_binary, + self.service.host, + self.service.binary, ] verifylist = [ ('enabled', True), ('disable_reason', reason), - ('host', compute_fakes.service_host), - ('service', compute_fakes.service_binary), + ('host', self.service.host), + ('service', self.service.binary), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -254,7 +245,7 @@ class TestServiceSet(TestService): mock_log.assert_called_once_with(msg) self.service_mock.enable.assert_called_with( - compute_fakes.service_host, - compute_fakes.service_binary + self.service.host, + self.service.binary ) self.assertIsNone(result) diff --git a/openstackclient/tests/fakes.py b/openstackclient/tests/fakes.py index 46f983dc..229b4652 100644 --- a/openstackclient/tests/fakes.py +++ b/openstackclient/tests/fakes.py @@ -189,6 +189,10 @@ class FakeResource(object): def keys(self): return self._info.keys() + @property + def info(self): + return self._info + class FakeResponse(requests.Response): diff --git a/openstackclient/tests/identity/v2_0/test_catalog.py b/openstackclient/tests/identity/v2_0/test_catalog.py index 1e27bb3c..d9ae6a80 100644 --- a/openstackclient/tests/identity/v2_0/test_catalog.py +++ b/openstackclient/tests/identity/v2_0/test_catalog.py @@ -36,6 +36,12 @@ class TestCatalog(utils.TestCommand): 'internalURL': 'https://internal.two.example.com', 'adminURL': 'https://admin.two.example.com', }, + { + 'region': None, + 'publicURL': 'https://public.none.example.com', + 'internalURL': 'https://internal.none.example.com', + 'adminURL': 'https://admin.none.example.com', + }, ], } @@ -87,7 +93,10 @@ class TestCatalogList(TestCatalog): 'adminURL: https://admin.one.example.com\n' 'two\n publicURL: https://public.two.example.com\n ' 'internalURL: https://internal.two.example.com\n ' - 'adminURL: https://admin.two.example.com\n', + 'adminURL: https://admin.two.example.com\n' + '<none>\n publicURL: https://public.none.example.com\n ' + 'internalURL: https://internal.none.example.com\n ' + 'adminURL: https://admin.none.example.com\n', ), ) self.assertEqual(datalist, tuple(data)) @@ -164,7 +173,10 @@ class TestCatalogShow(TestCatalog): 'adminURL: https://admin.one.example.com\n' 'two\n publicURL: https://public.two.example.com\n ' 'internalURL: https://internal.two.example.com\n ' - 'adminURL: https://admin.two.example.com\n', + 'adminURL: https://admin.two.example.com\n' + '<none>\n publicURL: https://public.none.example.com\n ' + 'internalURL: https://internal.none.example.com\n ' + 'adminURL: https://admin.none.example.com\n', 'qwertyuiop', 'supernova', 'compute', diff --git a/openstackclient/tests/identity/v3/test_catalog.py b/openstackclient/tests/identity/v3/test_catalog.py index a03c9d3e..1b8fa085 100644 --- a/openstackclient/tests/identity/v3/test_catalog.py +++ b/openstackclient/tests/identity/v3/test_catalog.py @@ -38,6 +38,11 @@ class TestCatalog(utils.TestCommand): 'url': 'https://internal.example.com', 'interface': 'internal', }, + { + 'region': None, + 'url': 'https://none.example.com', + 'interface': 'none', + }, ], } @@ -81,7 +86,8 @@ class TestCatalogList(TestCatalog): 'compute', 'onlyone\n public: https://public.example.com\n' 'onlyone\n admin: https://admin.example.com\n' - '<none>\n internal: https://internal.example.com\n', + '<none>\n internal: https://internal.example.com\n' + '<none>\n none: https://none.example.com\n', ), ) self.assertEqual(datalist, tuple(data)) @@ -114,7 +120,8 @@ class TestCatalogShow(TestCatalog): datalist = ( 'onlyone\n public: https://public.example.com\nonlyone\n' ' admin: https://admin.example.com\n' - '<none>\n internal: https://internal.example.com\n', + '<none>\n internal: https://internal.example.com\n' + '<none>\n none: https://none.example.com\n', 'qwertyuiop', 'supernova', 'compute', diff --git a/openstackclient/tests/identity/v3/test_identity_provider.py b/openstackclient/tests/identity/v3/test_identity_provider.py index 465e79ba..3ff79812 100644 --- a/openstackclient/tests/identity/v3/test_identity_provider.py +++ b/openstackclient/tests/identity/v3/test_identity_provider.py @@ -616,6 +616,7 @@ class TestIdentityProviderShow(TestIdentityProvider): self.identity_providers_mock.get.assert_called_with( identity_fakes.idp_id, + id='test_idp' ) collist = ('description', 'enabled', 'id', 'remote_ids') diff --git a/openstackclient/tests/identity/v3/test_service_provider.py b/openstackclient/tests/identity/v3/test_service_provider.py index 80d60c5a..99ea1f75 100644 --- a/openstackclient/tests/identity/v3/test_service_provider.py +++ b/openstackclient/tests/identity/v3/test_service_provider.py @@ -408,6 +408,7 @@ class TestServiceProviderShow(TestServiceProvider): self.service_providers_mock.get.assert_called_with( service_fakes.sp_id, + id='BETA' ) collist = ('auth_url', 'description', 'enabled', 'id', 'sp_url') diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py index eadbe5e8..181552d9 100644 --- a/openstackclient/tests/volume/v2/fakes.py +++ b/openstackclient/tests/volume/v2/fakes.py @@ -451,6 +451,44 @@ class FakeVolume(object): return mock.MagicMock(side_effect=volumes) + @staticmethod + def get_volume_columns(volume=None): + """Get the volume columns from a faked volume object. + + :param volume: + A FakeResource objects faking volume + :return + A tuple which may include the following keys: + ('id', 'name', 'description', 'status', 'size', 'volume_type', + 'metadata', 'snapshot', 'availability_zone', 'attachments') + """ + if volume is not None: + return tuple(k for k in sorted(volume.keys())) + return tuple([]) + + @staticmethod + def get_volume_data(volume=None): + """Get the volume data from a faked volume object. + + :param volume: + A FakeResource objects faking volume + :return + A tuple which may include the following values: + ('ce26708d', 'fake_volume', 'fake description', 'available', + 20, 'fake_lvmdriver-1', "Alpha='a', Beta='b', Gamma='g'", + 1, 'nova', [{'device': '/dev/ice', 'server_id': '1233'}]) + """ + data_list = [] + if volume is not None: + for x in sorted(volume.keys()): + if x == 'tags': + # The 'tags' should be format_list + data_list.append( + common_utils.format_list(volume.info.get(x))) + else: + data_list.append(volume.info.get(x)) + return tuple(data_list) + class FakeAvailabilityZone(object): """Fake one or more volume availability zones (AZs).""" diff --git a/openstackclient/tests/volume/v2/test_volume.py b/openstackclient/tests/volume/v2/test_volume.py index 5689d008..85ff6142 100644 --- a/openstackclient/tests/volume/v2/test_volume.py +++ b/openstackclient/tests/volume/v2/test_volume.py @@ -772,27 +772,30 @@ class TestVolumeShow(TestVolume): def setUp(self): super(TestVolumeShow, self).setUp() - self.volumes_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.VOLUME), - loaded=True) + self._volume = volume_fakes.FakeVolume.create_one_volume() + self.volumes_mock.get.return_value = self._volume # Get the command object to test self.cmd = volume.ShowVolume(self.app, None) def test_volume_show(self): arglist = [ - volume_fakes.volume_id + self._volume.id ] verifylist = [ - ("volume", volume_fakes.volume_id) + ("volume", self._volume.id) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.volumes_mock.get.assert_called_with(volume_fakes.volume_id) + self.volumes_mock.get.assert_called_with(self._volume.id) + + self.assertEqual( + volume_fakes.FakeVolume.get_volume_columns(self._volume), + columns) - self.assertEqual(volume_fakes.VOLUME_columns, columns) - self.assertEqual(volume_fakes.VOLUME_data, data) + self.assertEqual( + volume_fakes.FakeVolume.get_volume_data(self._volume), + data) class TestVolumeSet(TestVolume): |
