diff options
Diffstat (limited to 'openstackclient')
| -rw-r--r-- | openstackclient/compute/v2/service.py | 13 | ||||
| -rw-r--r-- | openstackclient/image/v2/image.py | 50 | ||||
| -rw-r--r-- | openstackclient/network/v2/network.py | 2 | ||||
| -rw-r--r-- | openstackclient/network/v2/router.py | 1 | ||||
| -rw-r--r-- | openstackclient/tests/common/test_parseractions.py | 97 | ||||
| -rw-r--r-- | openstackclient/tests/compute/v2/test_server.py | 90 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v3/test_identity_provider.py | 4 | ||||
| -rw-r--r-- | openstackclient/tests/image/v2/fakes.py | 2 | ||||
| -rw-r--r-- | openstackclient/tests/image/v2/test_image.py | 251 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/test_network.py | 6 | ||||
| -rw-r--r-- | openstackclient/tests/network/v2/test_router.py | 6 | ||||
| -rw-r--r-- | openstackclient/tests/test_shell.py | 2 |
12 files changed, 368 insertions, 156 deletions
diff --git a/openstackclient/compute/v2/service.py b/openstackclient/compute/v2/service.py index dd32eb12..0a3a5fe4 100644 --- a/openstackclient/compute/v2/service.py +++ b/openstackclient/compute/v2/service.py @@ -80,7 +80,7 @@ class ListService(lister.Lister): ) for s in data)) -class SetService(lister.Lister): +class SetService(command.Command): """Set service command""" log = logging.getLogger(__name__ + ".SetService") @@ -112,19 +112,10 @@ class SetService(lister.Lister): def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) compute_client = self.app.client_manager.compute - columns = ( - "Host", - "Service", - "Disabled" - ) if parsed_args.enabled: action = compute_client.services.enable else: action = compute_client.services.disable - data = action(parsed_args.host, parsed_args.service) - return (columns, - (utils.get_item_properties( - s, columns, - ) for s in data)) + action(parsed_args.host, parsed_args.service) diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index a3c1a99d..ad536ba2 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -220,6 +220,7 @@ class CreateImage(show.ShowOne): help="Set a tag on this image " "(repeat option to set multiple tags)", ) + common.add_project_domain_option_to_parser(parser) for deadopt in self.deadopts: parser.add_argument( "--%s" % deadopt, @@ -231,6 +232,7 @@ class CreateImage(show.ShowOne): def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) + identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: @@ -285,6 +287,13 @@ class CreateImage(show.ShowOne): self.log.warning("Failed to get an image file.") return {}, {} + if parsed_args.owner: + kwargs['owner'] = common.find_project( + identity_client, + parsed_args.owner, + parsed_args.project_domain, + ).id + # If a volume is specified. if parsed_args.volume: volume_client = self.app.client_manager.volume @@ -693,6 +702,18 @@ class SetImage(command.Command): metavar="<ramdisk-id>", help="ID of ramdisk image used to boot this disk image", ) + deactivate_group = parser.add_mutually_exclusive_group() + deactivate_group.add_argument( + "--deactivate", + action="store_true", + help="Deactivate the image", + ) + deactivate_group.add_argument( + "--activate", + action="store_true", + help="Activate the image", + ) + common.add_project_domain_option_to_parser(parser) for deadopt in self.deadopts: parser.add_argument( "--%s" % deadopt, @@ -704,6 +725,7 @@ class SetImage(command.Command): def take_action(self, parsed_args): self.log.debug("take_action(%s)", parsed_args) + identity_client = self.app.client_manager.identity image_client = self.app.client_manager.image for deadopt in self.deadopts: @@ -745,18 +767,42 @@ class SetImage(command.Command): if parsed_args.private: kwargs['visibility'] = 'private' - if not kwargs: + # Checks if anything that requires getting the image + if not (kwargs or parsed_args.deactivate or parsed_args.activate): self.log.warning("No arguments specified") return {}, {} image = utils.find_resource( image_client.images, parsed_args.image) + if parsed_args.deactivate: + image_client.images.deactivate(image.id) + activation_status = "deactivated" + if parsed_args.activate: + image_client.images.reactivate(image.id) + activation_status = "activated" + + # Check if need to do the actual update + if not kwargs: + return {}, {} + if parsed_args.tags: # Tags should be extended, but duplicates removed kwargs['tags'] = list(set(image.tags).union(set(parsed_args.tags))) - image = image_client.images.update(image.id, **kwargs) + if parsed_args.owner: + kwargs['owner'] = common.find_project( + identity_client, + parsed_args.owner, + parsed_args.project_domain, + ).id + + try: + image = image_client.images.update(image.id, **kwargs) + except Exception as e: + if activation_status is not None: + print("Image %s was %s." % (image.id, activation_status)) + raise e class ShowImage(show.ShowOne): diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py index 519356b4..15f4592b 100644 --- a/openstackclient/network/v2/network.py +++ b/openstackclient/network/v2/network.py @@ -132,7 +132,6 @@ class DeleteNetwork(command.Command): for network in parsed_args.network: obj = client.find_network(network) client.delete_network(obj) - return class ListNetwork(lister.Lister): @@ -271,7 +270,6 @@ class SetNetwork(command.Command): raise exceptions.CommandError(msg) client.update_network(obj) - return class ShowNetwork(show.ShowOne): diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py index 5ad7ccd2..09e0fe4c 100644 --- a/openstackclient/network/v2/router.py +++ b/openstackclient/network/v2/router.py @@ -146,7 +146,6 @@ class DeleteRouter(command.Command): for router in parsed_args.router: obj = client.find_router(router) client.delete_router(obj) - return class ListRouter(lister.Lister): diff --git a/openstackclient/tests/common/test_parseractions.py b/openstackclient/tests/common/test_parseractions.py index b75c4814..0109a3f3 100644 --- a/openstackclient/tests/common/test_parseractions.py +++ b/openstackclient/tests/common/test_parseractions.py @@ -20,34 +20,14 @@ from openstackclient.tests import utils class TestKeyValueAction(utils.TestCase): - def test_good_values(self): - parser = argparse.ArgumentParser() - - # Set up our typical usage - parser.add_argument( - '--property', - metavar='<key=value>', - action=parseractions.KeyValueAction, - help='Property to store for this volume ' - '(repeat option to set multiple properties)', - ) - - results = parser.parse_args([ - '--property', 'red=', - '--property', 'green=100%', - '--property', 'blue=50%', - ]) - actual = getattr(results, 'property', {}) - # All should pass through unmolested - expect = {'red': '', 'green': '100%', 'blue': '50%'} - self.assertDictEqual(expect, actual) + def setUp(self): + super(TestKeyValueAction, self).setUp() - def test_default_values(self): - parser = argparse.ArgumentParser() + self.parser = argparse.ArgumentParser() # Set up our typical usage - parser.add_argument( + self.parser.add_argument( '--property', metavar='<key=value>', action=parseractions.KeyValueAction, @@ -56,84 +36,55 @@ class TestKeyValueAction(utils.TestCase): '(repeat option to set multiple properties)', ) - results = parser.parse_args([ + def test_good_values(self): + results = self.parser.parse_args([ '--property', 'red=', '--property', 'green=100%', '--property', 'blue=50%', ]) actual = getattr(results, 'property', {}) - # Verify green default is changed, format default is unchanged + # All should pass through unmolested expect = {'red': '', 'green': '100%', 'blue': '50%', 'format': '#rgb'} self.assertDictEqual(expect, actual) def test_error_values(self): - parser = argparse.ArgumentParser() - - # Set up our typical usage - parser.add_argument( - '--property', - metavar='<key=value>', - action=parseractions.KeyValueAction, - default={'green': '20%', 'blue': '40%'}, - help='Property to store for this volume ' - '(repeat option to set multiple properties)', - ) - - results = parser.parse_args([ + results = self.parser.parse_args([ '--property', 'red', '--property', 'green=100%', '--property', 'blue', ]) - failhere = None actual = getattr(results, 'property', {}) - # Verify non-existent red key - try: - failhere = actual['red'] - except Exception as e: - self.assertTrue(type(e) == KeyError) - # Verify removal of blue key - try: - failhere = actual['blue'] - except Exception as e: - self.assertTrue(type(e) == KeyError) # There should be no red or blue - expect = {'green': '100%'} + expect = {'green': '100%', 'format': '#rgb'} self.assertDictEqual(expect, actual) - self.assertEqual(None, failhere) class TestNonNegativeAction(utils.TestCase): - def test_negative_values(self): - parser = argparse.ArgumentParser() + + def setUp(self): + super(TestNonNegativeAction, self).setUp() + + self.parser = argparse.ArgumentParser() # Set up our typical usage - parser.add_argument( + self.parser.add_argument( '--foo', metavar='<foo>', type=int, action=parseractions.NonNegativeAction, ) + def test_negative_values(self): self.assertRaises( argparse.ArgumentTypeError, - parser.parse_args, + self.parser.parse_args, "--foo -1".split() ) def test_zero_values(self): - parser = argparse.ArgumentParser() - - # Set up our typical usage - parser.add_argument( - '--foo', - metavar='<foo>', - type=int, - action=parseractions.NonNegativeAction, - ) - - results = parser.parse_args( + results = self.parser.parse_args( '--foo 0'.split() ) @@ -141,17 +92,7 @@ class TestNonNegativeAction(utils.TestCase): self.assertEqual(actual, 0) def test_positive_values(self): - parser = argparse.ArgumentParser() - - # Set up our typical usage - parser.add_argument( - '--foo', - metavar='<foo>', - type=int, - action=parseractions.NonNegativeAction, - ) - - results = parser.parse_args( + results = self.parser.parse_args( '--foo 1'.split() ) diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py index ef8ae3e1..dba44293 100644 --- a/openstackclient/tests/compute/v2/test_server.py +++ b/openstackclient/tests/compute/v2/test_server.py @@ -14,7 +14,6 @@ # import mock -import testtools from mock import call from openstackclient.common import exceptions @@ -1066,7 +1065,7 @@ class TestServerUnshelve(TestServer): self.run_method_with_servers('unshelve', 3) -class TestServerGeneral(testtools.TestCase): +class TestServerGeneral(TestServer): OLD = { 'private': [ { @@ -1116,3 +1115,90 @@ class TestServerGeneral(testtools.TestCase): server._get_ip_address, self.OLD, 'public', [4, 6]) self.assertRaises(exceptions.CommandError, server._get_ip_address, self.OLD, 'private', [6]) + + def test_format_servers_list_power_state(self): + self.assertEqual("NOSTATE", + server._format_servers_list_power_state(0x00)) + self.assertEqual("Running", + server._format_servers_list_power_state(0x01)) + self.assertEqual("", + server._format_servers_list_power_state(0x02)) + self.assertEqual("Paused", + server._format_servers_list_power_state(0x03)) + self.assertEqual("Shutdown", + server._format_servers_list_power_state(0x04)) + self.assertEqual("", + server._format_servers_list_power_state(0x05)) + self.assertEqual("Crashed", + server._format_servers_list_power_state(0x06)) + self.assertEqual("Suspended", + server._format_servers_list_power_state(0x07)) + self.assertEqual("N/A", + server._format_servers_list_power_state(0x08)) + + def test_format_servers_list_networks(self): + # Setup network info to test. + networks = { + u'public': [u'10.20.30.40', u'2001:db8::f'], + u'private': [u'2001:db8::f', u'10.20.30.40'], + } + + # Prepare expected data. + # Since networks is a dict, whose items are in random order, there + # could be two results after formatted. + data_1 = (u'private=2001:db8::f, 10.20.30.40; ' + u'public=10.20.30.40, 2001:db8::f') + data_2 = (u'public=10.20.30.40, 2001:db8::f; ' + u'private=2001:db8::f, 10.20.30.40') + + # Call _format_servers_list_networks(). + networks_format = server._format_servers_list_networks(networks) + + msg = ('Network string is not formatted correctly.\n' + 'reference = %s or %s\n' + 'actual = %s\n' % + (data_1, data_2, networks_format)) + self.assertIn(networks_format, (data_1, data_2), msg) + + @mock.patch('openstackclient.common.utils.find_resource') + def test_prep_server_detail(self, find_resource): + # Setup mock method return value. utils.find_resource() will be called + # twice in _prep_server_detail(): + # - The first time, return image info. + # - The second time, return flavor info. + _image = image_fakes.FakeImage.create_one_image() + _flavor = compute_fakes.FakeFlavor.create_one_flavor() + find_resource.side_effect = [_image, _flavor] + + # compute_client.servers.get() will be called once, return server info. + server_info = { + 'image': {u'id': _image.id}, + 'flavor': {u'id': _flavor.id}, + 'tenant_id': u'tenant-id-xxx', + 'networks': {u'public': [u'10.20.30.40', u'2001:db8::f']}, + 'links': u'http://xxx.yyy.com', + } + _server = compute_fakes.FakeServer.create_one_server(attrs=server_info) + self.servers_mock.get.return_value = _server + + # Prepare result data. + info = { + 'id': _server.id, + 'name': _server.name, + 'addresses': u'public=10.20.30.40, 2001:db8::f', + 'flavor': u'%s (%s)' % (_flavor.name, _flavor.id), + 'image': u'%s (%s)' % (_image.name, _image.id), + 'project_id': u'tenant-id-xxx', + 'properties': '', + } + + # Call _prep_server_detail(). + server_detail = server._prep_server_detail( + self.app.client_manager.compute, + _server + ) + # 'networks' is used to create _server. Remove it. + server_detail.pop('networks') + + # Check the results. + self.assertDictEqual(info, server_detail) diff --git a/openstackclient/tests/identity/v3/test_identity_provider.py b/openstackclient/tests/identity/v3/test_identity_provider.py index db097d5d..36358be3 100644 --- a/openstackclient/tests/identity/v3/test_identity_provider.py +++ b/openstackclient/tests/identity/v3/test_identity_provider.py @@ -638,5 +638,5 @@ class TestIdentityProviderSet(TestIdentityProvider): # expect take_action() to return (None, None) as # neither --enable nor --disable was specified - self.assertEqual(None, columns) - self.assertEqual(None, data) + self.assertIsNone(columns) + self.assertIsNone(data) diff --git a/openstackclient/tests/image/v2/fakes.py b/openstackclient/tests/image/v2/fakes.py index 692ef104..5441a3e2 100644 --- a/openstackclient/tests/image/v2/fakes.py +++ b/openstackclient/tests/image/v2/fakes.py @@ -195,7 +195,7 @@ class FakeImage(object): 'owner': 'image-owner' + uuid.uuid4().hex, 'protected': bool(random.choice([0, 1])), 'visibility': random.choice(['public', 'private']), - 'tags': [uuid.uuid4().hex for r in range(random.randint(1, 5))], + 'tags': [uuid.uuid4().hex for r in range(2)], } # Overwrite default attributes if there are some attributes set diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py index 10266f02..02182413 100644 --- a/openstackclient/tests/image/v2/test_image.py +++ b/openstackclient/tests/image/v2/test_image.py @@ -55,19 +55,26 @@ class TestImageCreate(TestImage): def setUp(self): super(TestImageCreate, self).setUp() - self.images_mock.create.return_value = fakes.FakeResource( + self.new_image = image_fakes.FakeImage.create_one_image() + self.images_mock.create.return_value = self.new_image + + self.project_mock.get.return_value = fakes.FakeResource( None, - copy.deepcopy(image_fakes.IMAGE), + copy.deepcopy(identity_fakes.PROJECT), loaded=True, ) - # This is the return value for utils.find_resource() - self.images_mock.get.return_value = copy.deepcopy(image_fakes.IMAGE) - self.images_mock.update.return_value = fakes.FakeResource( + + self.domain_mock.get.return_value = fakes.FakeResource( None, - copy.deepcopy(image_fakes.IMAGE), + copy.deepcopy(identity_fakes.DOMAIN), loaded=True, ) + # This is the return value for utils.find_resource() + self.images_mock.get.return_value = copy.deepcopy( + image_fakes.FakeImage.get_image_info(self.new_image)) + self.images_mock.update.return_value = self.new_image + # Get the command object to test self.cmd = image.CreateImage(self.app, None) @@ -77,12 +84,12 @@ class TestImageCreate(TestImage): } self.images_mock.configure_mock(**mock_exception) arglist = [ - image_fakes.image_name, + self.new_image.name ] verifylist = [ ('container_format', image.DEFAULT_CONTAINER_FORMAT), ('disk_format', image.DEFAULT_DISK_FORMAT), - ('name', image_fakes.image_name), + ('name', self.new_image.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -91,7 +98,7 @@ class TestImageCreate(TestImage): # ImageManager.create(name=, **) self.images_mock.create.assert_called_with( - name=image_fakes.image_name, + name=self.new_image.name, container_format=image.DEFAULT_CONTAINER_FORMAT, disk_format=image.DEFAULT_DISK_FORMAT, ) @@ -103,8 +110,12 @@ class TestImageCreate(TestImage): mock.ANY, mock.ANY, ) - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_SHOW_data, data) + self.assertEqual( + image_fakes.FakeImage.get_image_columns(self.new_image), + columns) + self.assertEqual( + image_fakes.FakeImage.get_image_data(self.new_image), + data) @mock.patch('glanceclient.common.utils.get_data_file', name='Open') def test_image_reserve_options(self, mock_open): @@ -120,22 +131,26 @@ class TestImageCreate(TestImage): '--disk-format', 'fs', '--min-disk', '10', '--min-ram', '4', - '--owner', '123456', - '--protected', - '--private', - image_fakes.image_name, + '--owner', self.new_image.owner, + ('--protected' + if self.new_image.protected else '--unprotected'), + ('--private' + if self.new_image.visibility == 'private' else '--public'), + '--project-domain', identity_fakes.domain_id, + self.new_image.name, ] verifylist = [ ('container_format', 'ovf'), ('disk_format', 'fs'), ('min_disk', 10), ('min_ram', 4), - ('owner', '123456'), - ('protected', True), - ('unprotected', False), - ('public', False), - ('private', True), - ('name', image_fakes.image_name), + ('owner', self.new_image.owner), + ('protected', self.new_image.protected), + ('unprotected', not self.new_image.protected), + ('public', self.new_image.visibility == 'public'), + ('private', self.new_image.visibility == 'private'), + ('project_domain', identity_fakes.domain_id), + ('name', self.new_image.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -144,14 +159,14 @@ class TestImageCreate(TestImage): # ImageManager.create(name=, **) self.images_mock.create.assert_called_with( - name=image_fakes.image_name, + name=self.new_image.name, container_format='ovf', disk_format='fs', min_disk=10, min_ram=4, - owner='123456', - protected=True, - visibility='private', + owner=identity_fakes.project_id, + protected=self.new_image.protected, + visibility=self.new_image.visibility, ) # Verify update() was not called, if it was show the args @@ -161,14 +176,53 @@ class TestImageCreate(TestImage): mock.ANY, mock.ANY, ) - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_SHOW_data, data) + self.assertEqual( + image_fakes.FakeImage.get_image_columns(self.new_image), + columns) + self.assertEqual( + image_fakes.FakeImage.get_image_data(self.new_image), + data) + + def test_image_create_with_unexist_owner(self): + self.project_mock.get.side_effect = exceptions.NotFound(None) + self.project_mock.find.side_effect = exceptions.NotFound(None) + + arglist = [ + '--container-format', 'ovf', + '--disk-format', 'fs', + '--min-disk', '10', + '--min-ram', '4', + '--owner', 'unexist_owner', + '--protected', + '--private', + image_fakes.image_name, + ] + verifylist = [ + ('container_format', 'ovf'), + ('disk_format', 'fs'), + ('min_disk', 10), + ('min_ram', 4), + ('owner', 'unexist_owner'), + ('protected', True), + ('unprotected', False), + ('public', False), + ('private', True), + ('name', image_fakes.image_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args, + ) @mock.patch('glanceclient.common.utils.get_data_file', name='Open') def test_image_create_file(self, mock_open): mock_file = mock.MagicMock(name='File') mock_open.return_value = mock_file - mock_open.read.return_value = image_fakes.IMAGE_data + mock_open.read.return_value = ( + image_fakes.FakeImage.get_image_data(self.new_image)) mock_exception = { 'find.side_effect': exceptions.CommandError('x'), } @@ -176,23 +230,25 @@ class TestImageCreate(TestImage): arglist = [ '--file', 'filer', - '--unprotected', - '--public', + ('--unprotected' + if not self.new_image.protected else '--protected'), + ('--public' + if self.new_image.visibility == 'public' else '--private'), '--property', 'Alpha=1', '--property', 'Beta=2', - '--tag', 'awesome', - '--tag', 'better', - image_fakes.image_name, + '--tag', self.new_image.tags[0], + '--tag', self.new_image.tags[1], + self.new_image.name, ] verifylist = [ ('file', 'filer'), - ('protected', False), - ('unprotected', True), - ('public', True), - ('private', False), + ('protected', self.new_image.protected), + ('unprotected', not self.new_image.protected), + ('public', self.new_image.visibility == 'public'), + ('private', self.new_image.visibility == 'private'), ('properties', {'Alpha': '1', 'Beta': '2'}), - ('tags', ['awesome', 'better']), - ('name', image_fakes.image_name), + ('tags', self.new_image.tags), + ('name', self.new_image.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -201,14 +257,14 @@ class TestImageCreate(TestImage): # ImageManager.create(name=, **) self.images_mock.create.assert_called_with( - name=image_fakes.image_name, + name=self.new_image.name, container_format=image.DEFAULT_CONTAINER_FORMAT, disk_format=image.DEFAULT_DISK_FORMAT, - protected=False, - visibility='public', + protected=self.new_image.protected, + visibility=self.new_image.visibility, Alpha='1', Beta='2', - tags=['awesome', 'better'], + tags=self.new_image.tags, ) # Verify update() was not called, if it was show the args @@ -218,17 +274,21 @@ class TestImageCreate(TestImage): mock.ANY, mock.ANY, ) - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_SHOW_data, data) + self.assertEqual( + image_fakes.FakeImage.get_image_columns(self.new_image), + columns) + self.assertEqual( + image_fakes.FakeImage.get_image_data(self.new_image), + data) def test_image_create_dead_options(self): arglist = [ '--store', 'somewhere', - image_fakes.image_name, + self.new_image.name, ] verifylist = [ - ('name', image_fakes.image_name), + ('name', self.new_image.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -675,6 +735,18 @@ class TestImageSet(TestImage): schemas.SchemaBasedModel, ) + self.project_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.PROJECT), + loaded=True, + ) + + self.domain_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.DOMAIN), + loaded=True, + ) + self.images_mock.get.return_value = self.model(**image_fakes.IMAGE) self.images_mock.update.return_value = self.model(**image_fakes.IMAGE) # Get the command object to test @@ -683,20 +755,22 @@ class TestImageSet(TestImage): def test_image_set_options(self): arglist = [ '--name', 'new-name', - '--owner', 'new-owner', + '--owner', identity_fakes.project_name, '--min-disk', '2', '--min-ram', '4', '--container-format', 'ovf', '--disk-format', 'vmdk', + '--project-domain', identity_fakes.domain_id, image_fakes.image_id, ] verifylist = [ ('name', 'new-name'), - ('owner', 'new-owner'), + ('owner', identity_fakes.project_name), ('min_disk', 2), ('min_ram', 4), ('container_format', 'ovf'), ('disk_format', 'vmdk'), + ('project_domain', identity_fakes.domain_id), ('image', image_fakes.image_id), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -706,7 +780,7 @@ class TestImageSet(TestImage): kwargs = { 'name': 'new-name', - 'owner': 'new-owner', + 'owner': identity_fakes.project_id, 'min_disk': 2, 'min_ram': 4, 'container_format': 'ovf', @@ -716,6 +790,25 @@ class TestImageSet(TestImage): self.images_mock.update.assert_called_with( image_fakes.image_id, **kwargs) + def test_image_set_with_unexist_owner(self): + self.project_mock.get.side_effect = exceptions.NotFound(None) + self.project_mock.find.side_effect = exceptions.NotFound(None) + + arglist = [ + '--owner', 'unexist_owner', + image_fakes.image_id, + ] + verifylist = [ + ('owner', 'unexist_owner'), + ('image', image_fakes.image_id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, parsed_args) + def test_image_set_bools1(self): arglist = [ '--protected', @@ -858,6 +951,64 @@ class TestImageSet(TestImage): **kwargs ) + def test_image_set_activate(self): + arglist = [ + '--tag', 'test-tag', + '--activate', + image_fakes.image_name, + ] + verifylist = [ + ('tags', ['test-tag']), + ('image', image_fakes.image_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + self.cmd.take_action(parsed_args) + + kwargs = { + 'tags': ['test-tag'], + } + + self.images_mock.reactivate.assert_called_with( + image_fakes.image_id, + ) + + # ImageManager.update(image, **kwargs) + self.images_mock.update.assert_called_with( + image_fakes.image_id, + **kwargs + ) + + def test_image_set_deactivate(self): + arglist = [ + '--tag', 'test-tag', + '--deactivate', + image_fakes.image_name, + ] + verifylist = [ + ('tags', ['test-tag']), + ('image', image_fakes.image_name), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + self.cmd.take_action(parsed_args) + + kwargs = { + 'tags': ['test-tag'], + } + + self.images_mock.deactivate.assert_called_with( + image_fakes.image_id, + ) + + # ImageManager.update(image, **kwargs) + self.images_mock.update.assert_called_with( + image_fakes.image_id, + **kwargs + ) + def test_image_set_tag_merge(self): old_image = copy.copy(image_fakes.IMAGE) old_image['tags'] = ['old1', 'new2'] diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py index 5a718686..f22224b6 100644 --- a/openstackclient/tests/network/v2/test_network.py +++ b/openstackclient/tests/network/v2/test_network.py @@ -301,7 +301,7 @@ class TestDeleteNetwork(TestNetwork): result = self.cmd.take_action(parsed_args) self.network.delete_network.assert_called_with(self._network) - self.assertEqual(None, result) + self.assertIsNone(result) class TestListNetwork(TestNetwork): @@ -443,7 +443,7 @@ class TestSetNetwork(TestNetwork): result = self.cmd.take_action(parsed_args) self.network.update_network.assert_called_with(self._network) - self.assertEqual(None, result) + self.assertIsNone(result) def test_set_that(self): self._network.is_dirty = True @@ -463,7 +463,7 @@ class TestSetNetwork(TestNetwork): result = self.cmd.take_action(parsed_args) self.network.update_network.assert_called_with(self._network) - self.assertEqual(None, result) + self.assertIsNone(result) def test_set_nothing(self): self._network.is_dirty = False diff --git a/openstackclient/tests/network/v2/test_router.py b/openstackclient/tests/network/v2/test_router.py index d483be85..fba6e192 100644 --- a/openstackclient/tests/network/v2/test_router.py +++ b/openstackclient/tests/network/v2/test_router.py @@ -115,7 +115,7 @@ class TestDeleteRouter(TestRouter): result = self.cmd.take_action(parsed_args) self.network.delete_router.assert_called_with(self._router) - self.assertEqual(None, result) + self.assertIsNone(result) class TestListRouter(TestRouter): @@ -235,7 +235,7 @@ class TestSetRouter(TestRouter): 'name': 'noob', } self.network.update_router.assert_called_with(self._router, **attrs) - self.assertEqual(None, result) + self.assertIsNone(result) def test_set_that(self): arglist = [ @@ -257,7 +257,7 @@ class TestSetRouter(TestRouter): 'distributed': False, } self.network.update_router.assert_called_with(self._router, **attrs) - self.assertEqual(None, result) + self.assertIsNone(result) def test_set_distributed_centralized(self): arglist = [ diff --git a/openstackclient/tests/test_shell.py b/openstackclient/tests/test_shell.py index c548d890..c4546d89 100644 --- a/openstackclient/tests/test_shell.py +++ b/openstackclient/tests/test_shell.py @@ -76,7 +76,7 @@ CLOUD_2 = { 'project_name': 'heart-o-gold', 'username': 'zaphod', }, - 'region_name': 'occ-cloud', + 'region_name': 'occ-cloud,krikkit,occ-env', 'log_file': '/tmp/test_log_file', 'log_level': 'debug', } |
