summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/compute/v2/service.py13
-rw-r--r--openstackclient/image/v2/image.py50
-rw-r--r--openstackclient/network/v2/network.py2
-rw-r--r--openstackclient/network/v2/router.py1
-rw-r--r--openstackclient/tests/common/test_parseractions.py97
-rw-r--r--openstackclient/tests/compute/v2/test_server.py90
-rw-r--r--openstackclient/tests/identity/v3/test_identity_provider.py4
-rw-r--r--openstackclient/tests/image/v2/fakes.py2
-rw-r--r--openstackclient/tests/image/v2/test_image.py251
-rw-r--r--openstackclient/tests/network/v2/test_network.py6
-rw-r--r--openstackclient/tests/network/v2/test_router.py6
-rw-r--r--openstackclient/tests/test_shell.py2
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',
}