summaryrefslogtreecommitdiff
path: root/openstackclient/tests/compute/v2
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient/tests/compute/v2')
-rw-r--r--openstackclient/tests/compute/v2/fakes.py100
-rw-r--r--openstackclient/tests/compute/v2/test_flavor.py178
-rw-r--r--openstackclient/tests/compute/v2/test_server.py6
-rw-r--r--openstackclient/tests/compute/v2/test_server_group.py283
4 files changed, 528 insertions, 39 deletions
diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py
index 7f39bad0..b3f3fb49 100644
--- a/openstackclient/tests/compute/v2/fakes.py
+++ b/openstackclient/tests/compute/v2/fakes.py
@@ -100,8 +100,7 @@ class FakeAggregate(object):
:return:
A FakeResource object, with id and other attributes
"""
- if attrs is None:
- attrs = {}
+ attrs = attrs or {}
# Set default attribute
aggregate_info = {
@@ -177,6 +176,9 @@ class FakeComputev2Client(object):
self.hosts = mock.Mock()
self.hosts.resource_class = fakes.FakeResource(None, {})
+ self.server_groups = mock.Mock()
+ self.server_groups.resource_class = fakes.FakeResource(None, {})
+
self.auth_token = kwargs['token']
self.management_url = kwargs['endpoint']
@@ -217,7 +219,7 @@ class FakeHypervisor(object):
"""Fake one or more hypervisor."""
@staticmethod
- def create_one_hypervisor(attrs={}):
+ def create_one_hypervisor(attrs=None):
"""Create a fake hypervisor.
:param Dictionary attrs:
@@ -225,6 +227,8 @@ class FakeHypervisor(object):
:return:
A FakeResource object, with id, hypervisor_hostname, and so on
"""
+ attrs = attrs or {}
+
# Set default attributes.
hypervisor_info = {
'id': 'hypervisor-id-' + uuid.uuid4().hex,
@@ -263,7 +267,7 @@ class FakeHypervisor(object):
return hypervisor
@staticmethod
- def create_hypervisors(attrs={}, count=2):
+ def create_hypervisors(attrs=None, count=2):
"""Create multiple fake hypervisors.
:param Dictionary attrs:
@@ -284,7 +288,7 @@ class FakeHypervisorStats(object):
"""Fake one or more hypervisor stats."""
@staticmethod
- def create_one_hypervisor_stats(attrs={}):
+ def create_one_hypervisor_stats(attrs=None):
"""Create a fake hypervisor stats.
:param Dictionary attrs:
@@ -292,6 +296,8 @@ class FakeHypervisorStats(object):
:return:
A FakeResource object, with id, hypervisor_hostname, and so on
"""
+ attrs = attrs or {}
+
# Set default attributes.
stats_info = {
'count': 2,
@@ -319,7 +325,7 @@ class FakeHypervisorStats(object):
return hypervisor_stats
@staticmethod
- def create_hypervisors_stats(attrs={}, count=2):
+ def create_hypervisors_stats(attrs=None, count=2):
"""Create multiple fake hypervisors stats.
:param Dictionary attrs:
@@ -349,8 +355,7 @@ class FakeSecurityGroup(object):
:return:
A FakeResource object, with id, name, etc.
"""
- if attrs is None:
- attrs = {}
+ attrs = attrs or {}
# Set default attributes.
security_group_attrs = {
@@ -400,8 +405,7 @@ class FakeSecurityGroupRule(object):
:return:
A FakeResource object, with id, etc.
"""
- if attrs is None:
- attrs = {}
+ attrs = attrs or {}
# Set default attributes.
security_group_rule_attrs = {
@@ -445,7 +449,7 @@ class FakeServer(object):
"""Fake one or more compute servers."""
@staticmethod
- def create_one_server(attrs={}, methods={}):
+ def create_one_server(attrs=None, methods=None):
"""Create a fake server.
:param Dictionary attrs:
@@ -455,6 +459,9 @@ class FakeServer(object):
:return:
A FakeResource object, with id, name, metadata
"""
+ attrs = attrs or {}
+ methods = methods or {}
+
# Set default attributes.
server_info = {
'id': 'server-id-' + uuid.uuid4().hex,
@@ -465,7 +472,8 @@ class FakeServer(object):
},
'flavor': {
'id': 'flavor-id-' + uuid.uuid4().hex,
- }
+ },
+ 'OS-EXT-STS:power_state': 1,
}
# Overwrite default attributes.
@@ -477,7 +485,7 @@ class FakeServer(object):
return server
@staticmethod
- def create_servers(attrs={}, methods={}, count=2):
+ def create_servers(attrs=None, methods=None, count=2):
"""Create multiple fake servers.
:param Dictionary attrs:
@@ -527,8 +535,7 @@ class FakeFlavor(object):
:return:
A FakeResource object, with id, name, ram, vcpus, properties
"""
- if attrs is None:
- attrs = {}
+ attrs = attrs or {}
# Set default attributes.
flavor_info = {
@@ -537,8 +544,8 @@ class FakeFlavor(object):
'ram': 8192,
'vcpus': 4,
'disk': 128,
- 'swap': '',
- 'rxtx_factor': '1.0',
+ 'swap': 0,
+ 'rxtx_factor': 1.0,
'OS-FLV-DISABLED:disabled': False,
'os-flavor-access:is_public': True,
'OS-FLV-EXT-DATA:ephemeral': 0,
@@ -566,7 +573,7 @@ class FakeFlavor(object):
return flavor
@staticmethod
- def create_flavors(attrs={}, count=2):
+ def create_flavors(attrs=None, count=2):
"""Create multiple fake flavors.
:param Dictionary attrs:
@@ -614,10 +621,9 @@ class FakeKeypair(object):
:return:
A FakeResource
"""
- # Set default attributes.
- if attrs is None:
- attrs = {}
+ attrs = attrs or {}
+ # Set default attributes.
keypair_info = {
'name': 'keypair-name-' + uuid.uuid4().hex,
'fingerprint': 'dummy',
@@ -658,7 +664,7 @@ class FakeAvailabilityZone(object):
"""Fake one or more compute availability zones (AZs)."""
@staticmethod
- def create_one_availability_zone(attrs={}):
+ def create_one_availability_zone(attrs=None):
"""Create a fake AZ.
:param Dictionary attrs:
@@ -666,6 +672,8 @@ class FakeAvailabilityZone(object):
:return:
A FakeResource object with zoneName, zoneState, etc.
"""
+ attrs = attrs or {}
+
# Set default attributes.
host_name = uuid.uuid4().hex
service_name = uuid.uuid4().hex
@@ -689,7 +697,7 @@ class FakeAvailabilityZone(object):
return availability_zone
@staticmethod
- def create_availability_zones(attrs={}, count=2):
+ def create_availability_zones(attrs=None, count=2):
"""Create multiple fake AZs.
:param Dictionary attrs:
@@ -712,7 +720,7 @@ class FakeFloatingIP(object):
"""Fake one or more floating ip."""
@staticmethod
- def create_one_floating_ip(attrs={}):
+ def create_one_floating_ip(attrs=None):
"""Create a fake floating ip.
:param Dictionary attrs:
@@ -720,6 +728,8 @@ class FakeFloatingIP(object):
:return:
A FakeResource object, with id, ip, and so on
"""
+ attrs = attrs or {}
+
# Set default attributes.
floating_ip_attrs = {
'id': 'floating-ip-id-' + uuid.uuid4().hex,
@@ -739,7 +749,7 @@ class FakeFloatingIP(object):
return floating_ip
@staticmethod
- def create_floating_ips(attrs={}, count=2):
+ def create_floating_ips(attrs=None, count=2):
"""Create multiple fake floating ips.
:param Dictionary attrs:
@@ -778,7 +788,7 @@ class FakeNetwork(object):
"""Fake one or more networks."""
@staticmethod
- def create_one_network(attrs={}):
+ def create_one_network(attrs=None):
"""Create a fake network.
:param Dictionary attrs:
@@ -786,6 +796,8 @@ class FakeNetwork(object):
:return:
A FakeResource object, with id, label, cidr and so on
"""
+ attrs = attrs or {}
+
# Set default attributes.
network_attrs = {
'bridge': 'br100',
@@ -831,7 +843,7 @@ class FakeNetwork(object):
return network
@staticmethod
- def create_networks(attrs={}, count=2):
+ def create_networks(attrs=None, count=2):
"""Create multiple fake networks.
:param Dictionary attrs:
@@ -860,8 +872,7 @@ class FakeHost(object):
:return:
A FakeResource object, with id and other attributes
"""
- if attrs is None:
- attrs = {}
+ attrs = attrs or {}
# Set default attributes.
host_info = {
@@ -899,3 +910,34 @@ class FakeHost(object):
info=copy.deepcopy(host_info),
loaded=True)
return host
+
+
+class FakeServerGroup(object):
+ """Fake one server group"""
+
+ @staticmethod
+ def create_one_server_group(attrs=None):
+ """Create a fake server group
+
+ :param Dictionary attrs:
+ A dictionary with all attributes
+ :return:
+ A FakeResource object, with id and other attributes
+ """
+ if attrs is None:
+ attrs = {}
+
+ server_group_info = {
+ 'id': 'server-group-id-' + uuid.uuid4().hex,
+ 'members': [],
+ 'metadata': {},
+ 'name': 'server-group-name-' + uuid.uuid4().hex,
+ 'policies': [],
+ 'project_id': 'server-group-project-id-' + uuid.uuid4().hex,
+ 'user_id': 'server-group-user-id-' + uuid.uuid4().hex,
+ }
+ server_group_info.update(attrs)
+ server_group = fakes.FakeResource(
+ info=copy.deepcopy(server_group_info),
+ loaded=True)
+ return server_group
diff --git a/openstackclient/tests/compute/v2/test_flavor.py b/openstackclient/tests/compute/v2/test_flavor.py
index 03ca8807..6f507b16 100644
--- a/openstackclient/tests/compute/v2/test_flavor.py
+++ b/openstackclient/tests/compute/v2/test_flavor.py
@@ -30,6 +30,166 @@ class TestFlavor(compute_fakes.TestComputev2):
self.flavors_mock.reset_mock()
+class TestFlavorCreate(TestFlavor):
+
+ flavor = compute_fakes.FakeFlavor.create_one_flavor(
+ attrs={'links': 'flavor-links'})
+
+ columns = (
+ 'OS-FLV-DISABLED:disabled',
+ 'OS-FLV-EXT-DATA:ephemeral',
+ 'disk',
+ 'id',
+ 'name',
+ 'os-flavor-access:is_public',
+ 'ram',
+ 'rxtx_factor',
+ 'swap',
+ 'vcpus',
+ )
+ data = (
+ flavor.disabled,
+ flavor.ephemeral,
+ flavor.disk,
+ flavor.id,
+ flavor.name,
+ flavor.is_public,
+ flavor.ram,
+ flavor.rxtx_factor,
+ flavor.swap,
+ flavor.vcpus,
+ )
+
+ def setUp(self):
+ super(TestFlavorCreate, self).setUp()
+
+ self.flavors_mock.create.return_value = self.flavor
+ self.cmd = flavor.CreateFlavor(self.app, None)
+
+ def test_flavor_create_default_options(self):
+
+ arglist = [
+ self.flavor.name
+ ]
+ verifylist = [
+ ('name', self.flavor.name),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ default_args = (
+ self.flavor.name,
+ 256,
+ 1,
+ 0,
+ 'auto',
+ 0,
+ 0,
+ 1.0,
+ True
+ )
+ columns, data = self.cmd.take_action(parsed_args)
+ self.flavors_mock.create.assert_called_once_with(*default_args)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_flavor_create_all_options(self):
+
+ arglist = [
+ self.flavor.name,
+ '--id', self.flavor.id,
+ '--ram', str(self.flavor.ram),
+ '--disk', str(self.flavor.disk),
+ '--ephemeral', str(self.flavor.ephemeral),
+ '--swap', str(self.flavor.swap),
+ '--vcpus', str(self.flavor.vcpus),
+ '--rxtx-factor', str(self.flavor.rxtx_factor),
+ '--public',
+ ]
+ verifylist = [
+ ('name', self.flavor.name),
+ ('id', self.flavor.id),
+ ('ram', self.flavor.ram),
+ ('disk', self.flavor.disk),
+ ('ephemeral', self.flavor.ephemeral),
+ ('swap', self.flavor.swap),
+ ('vcpus', self.flavor.vcpus),
+ ('rxtx_factor', self.flavor.rxtx_factor),
+ ('public', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ args = (
+ self.flavor.name,
+ self.flavor.ram,
+ self.flavor.vcpus,
+ self.flavor.disk,
+ self.flavor.id,
+ self.flavor.ephemeral,
+ self.flavor.swap,
+ self.flavor.rxtx_factor,
+ self.flavor.is_public,
+ )
+ columns, data = self.cmd.take_action(parsed_args)
+ self.flavors_mock.create.assert_called_once_with(*args)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_flavor_create_other_options(self):
+
+ self.flavor.is_public = False
+ arglist = [
+ self.flavor.name,
+ '--id', self.flavor.id,
+ '--ram', str(self.flavor.ram),
+ '--disk', str(self.flavor.disk),
+ '--ephemeral', str(self.flavor.ephemeral),
+ '--swap', str(self.flavor.swap),
+ '--vcpus', str(self.flavor.vcpus),
+ '--rxtx-factor', str(self.flavor.rxtx_factor),
+ '--private',
+ ]
+ verifylist = [
+ ('name', self.flavor.name),
+ ('id', self.flavor.id),
+ ('ram', self.flavor.ram),
+ ('disk', self.flavor.disk),
+ ('ephemeral', self.flavor.ephemeral),
+ ('swap', self.flavor.swap),
+ ('vcpus', self.flavor.vcpus),
+ ('rxtx_factor', self.flavor.rxtx_factor),
+ ('public', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ args = (
+ self.flavor.name,
+ self.flavor.ram,
+ self.flavor.vcpus,
+ self.flavor.disk,
+ self.flavor.id,
+ self.flavor.ephemeral,
+ self.flavor.swap,
+ self.flavor.rxtx_factor,
+ self.flavor.is_public,
+ )
+ columns, data = self.cmd.take_action(parsed_args)
+ self.flavors_mock.create.assert_called_once_with(*args)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_flavor_create_no_options(self):
+ arglist = []
+ verifylist = None
+ self.assertRaises(tests_utils.ParserException,
+ self.check_parser,
+ self.cmd,
+ arglist,
+ verifylist)
+
+
class TestFlavorDelete(TestFlavor):
flavor = compute_fakes.FakeFlavor.create_one_flavor()
@@ -273,7 +433,7 @@ class TestFlavorSet(TestFlavor):
super(TestFlavorSet, self).setUp()
self.flavors_mock.find.return_value = self.flavor
-
+ self.flavors_mock.get.side_effect = exceptions.NotFound(None)
self.cmd = flavor.SetFlavor(self.app, None)
def test_flavor_set(self):
@@ -288,8 +448,8 @@ class TestFlavorSet(TestFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
-
- self.flavors_mock.find.assert_called_with(name='baremetal')
+ self.flavors_mock.find.assert_called_with(name=parsed_args.flavor,
+ is_public=None)
self.assertIsNone(result)
@@ -329,9 +489,9 @@ class TestFlavorShow(TestFlavor):
def setUp(self):
super(TestFlavorShow, self).setUp()
- # Return value of utils.find_resource()
- self.flavors_mock.get.return_value = self.flavor
-
+ # Return value of _find_resource()
+ self.flavors_mock.find.return_value = self.flavor
+ self.flavors_mock.get.side_effect = exceptions.NotFound(None)
self.cmd = flavor.ShowFlavor(self.app, None)
def test_show_no_options(self):
@@ -367,7 +527,7 @@ class TestFlavorUnset(TestFlavor):
super(TestFlavorUnset, self).setUp()
self.flavors_mock.find.return_value = self.flavor
-
+ self.flavors_mock.get.side_effect = exceptions.NotFound(None)
self.cmd = flavor.UnsetFlavor(self.app, None)
def test_flavor_unset(self):
@@ -382,6 +542,6 @@ class TestFlavorUnset(TestFlavor):
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
result = self.cmd.take_action(parsed_args)
-
- self.flavors_mock.find.assert_called_with(name='baremetal')
+ self.flavors_mock.find.assert_called_with(name=parsed_args.flavor,
+ is_public=None)
self.assertIsNone(result)
diff --git a/openstackclient/tests/compute/v2/test_server.py b/openstackclient/tests/compute/v2/test_server.py
index 17681672..903d0bff 100644
--- a/openstackclient/tests/compute/v2/test_server.py
+++ b/openstackclient/tests/compute/v2/test_server.py
@@ -89,6 +89,7 @@ class TestServer(compute_fakes.TestComputev2):
class TestServerCreate(TestServer):
columns = (
+ 'OS-EXT-STS:power_state',
'addresses',
'flavor',
'id',
@@ -100,6 +101,8 @@ class TestServerCreate(TestServer):
def datalist(self):
datalist = (
+ server._format_servers_list_power_state(
+ getattr(self.new_server, 'OS-EXT-STS:power_state')),
'',
self.flavor.name + ' (' + self.new_server.flavor.get('id') + ')',
self.new_server.id,
@@ -146,7 +149,6 @@ class TestServerCreate(TestServer):
('server_name', self.new_server.name),
]
- # Missing required args should bail here
self.assertRaises(utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
@@ -1476,6 +1478,8 @@ class TestServerGeneral(TestServer):
'image': u'%s (%s)' % (_image.name, _image.id),
'project_id': u'tenant-id-xxx',
'properties': '',
+ 'OS-EXT-STS:power_state': server._format_servers_list_power_state(
+ getattr(_server, 'OS-EXT-STS:power_state')),
}
# Call _prep_server_detail().
diff --git a/openstackclient/tests/compute/v2/test_server_group.py b/openstackclient/tests/compute/v2/test_server_group.py
new file mode 100644
index 00000000..70ff23f9
--- /dev/null
+++ b/openstackclient/tests/compute/v2/test_server_group.py
@@ -0,0 +1,283 @@
+# Copyright 2016 Huawei, Inc. All rights reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+#
+
+import mock
+
+from openstackclient.common import exceptions
+from openstackclient.common import utils
+from openstackclient.compute.v2 import server_group
+from openstackclient.tests.compute.v2 import fakes as compute_fakes
+from openstackclient.tests import utils as tests_utils
+
+
+class TestServerGroup(compute_fakes.TestComputev2):
+
+ fake_server_group = compute_fakes.FakeServerGroup.create_one_server_group()
+
+ columns = (
+ 'id',
+ 'members',
+ 'name',
+ 'policies',
+ 'project_id',
+ 'user_id',
+ )
+
+ data = (
+ fake_server_group.id,
+ utils.format_list(fake_server_group.members),
+ fake_server_group.name,
+ utils.format_list(fake_server_group.policies),
+ fake_server_group.project_id,
+ fake_server_group.user_id,
+ )
+
+ def setUp(self):
+ super(TestServerGroup, self).setUp()
+
+ # Get a shortcut to the ServerGroupsManager Mock
+ self.server_groups_mock = self.app.client_manager.compute.server_groups
+ self.server_groups_mock.reset_mock()
+
+
+class TestServerGroupCreate(TestServerGroup):
+
+ def setUp(self):
+ super(TestServerGroupCreate, self).setUp()
+
+ self.server_groups_mock.create.return_value = self.fake_server_group
+ self.cmd = server_group.CreateServerGroup(self.app, None)
+
+ def test_server_group_create(self):
+ arglist = [
+ '--policy', 'affinity',
+ 'affinity_group',
+ ]
+ verifylist = [
+ ('policy', ['affinity']),
+ ('name', 'affinity_group'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+ self.server_groups_mock.create.assert_called_once_with(
+ name=parsed_args.name,
+ policies=parsed_args.policy,
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_server_group_create_with_multiple_policies(self):
+ arglist = [
+ '--policy', 'affinity',
+ '--policy', 'soft-affinity',
+ 'affinity_group',
+ ]
+ verifylist = [
+ ('policy', ['affinity', 'soft-affinity']),
+ ('name', 'affinity_group'),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+ self.server_groups_mock.create.assert_called_once_with(
+ name=parsed_args.name,
+ policies=parsed_args.policy,
+ )
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)
+
+ def test_server_group_create_no_policy(self):
+ arglist = [
+ 'affinity_group',
+ ]
+ verifylist = None
+ self.assertRaises(tests_utils.ParserException,
+ self.check_parser,
+ self.cmd,
+ arglist,
+ verifylist)
+
+
+class TestServerGroupDelete(TestServerGroup):
+
+ def setUp(self):
+ super(TestServerGroupDelete, self).setUp()
+
+ self.server_groups_mock.get.return_value = self.fake_server_group
+ self.cmd = server_group.DeleteServerGroup(self.app, None)
+
+ def test_server_group_delete(self):
+ arglist = [
+ 'affinity_group',
+ ]
+ verifylist = [
+ ('server_group', ['affinity_group']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ self.server_groups_mock.get.assert_called_once_with('affinity_group')
+ self.server_groups_mock.delete.assert_called_once_with(
+ self.fake_server_group.id
+ )
+ self.assertIsNone(result)
+
+ def test_server_group_multiple_delete(self):
+ arglist = [
+ 'affinity_group',
+ 'anti_affinity_group'
+ ]
+ verifylist = [
+ ('server_group', ['affinity_group', 'anti_affinity_group']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ result = self.cmd.take_action(parsed_args)
+ self.server_groups_mock.get.assert_any_call('affinity_group')
+ self.server_groups_mock.get.assert_any_call('anti_affinity_group')
+ self.server_groups_mock.delete.assert_called_with(
+ self.fake_server_group.id
+ )
+ self.assertEqual(2, self.server_groups_mock.get.call_count)
+ self.assertEqual(2, self.server_groups_mock.delete.call_count)
+ self.assertIsNone(result)
+
+ def test_server_group_delete_no_input(self):
+ arglist = []
+ verifylist = None
+ self.assertRaises(tests_utils.ParserException,
+ self.check_parser,
+ self.cmd,
+ arglist,
+ verifylist)
+
+ def test_server_group_multiple_delete_with_exception(self):
+ arglist = [
+ 'affinity_group',
+ 'anti_affinity_group'
+ ]
+ verifylist = [
+ ('server_group', ['affinity_group', 'anti_affinity_group']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ find_mock_result = [self.fake_server_group, exceptions.CommandError]
+ with mock.patch.object(utils, 'find_resource',
+ side_effect=find_mock_result) as find_mock:
+ try:
+ self.cmd.take_action(parsed_args)
+ self.fail('CommandError should be raised.')
+ except exceptions.CommandError as e:
+ self.assertEqual('1 of 2 server groups failed to delete.',
+ str(e))
+
+ find_mock.assert_any_call(self.server_groups_mock,
+ 'affinity_group')
+ find_mock.assert_any_call(self.server_groups_mock,
+ 'anti_affinity_group')
+
+ self.assertEqual(2, find_mock.call_count)
+ self.server_groups_mock.delete.assert_called_once_with(
+ self.fake_server_group.id
+ )
+
+
+class TestServerGroupList(TestServerGroup):
+
+ list_columns = (
+ 'ID',
+ 'Name',
+ 'Policies',
+ )
+
+ list_columns_long = (
+ 'ID',
+ 'Name',
+ 'Policies',
+ 'Members',
+ 'Project Id',
+ 'User Id',
+ )
+
+ list_data = ((
+ TestServerGroup.fake_server_group.id,
+ TestServerGroup.fake_server_group.name,
+ utils.format_list(TestServerGroup.fake_server_group.policies),
+ ),)
+
+ list_data_long = ((
+ TestServerGroup.fake_server_group.id,
+ TestServerGroup.fake_server_group.name,
+ utils.format_list(TestServerGroup.fake_server_group.policies),
+ utils.format_list(TestServerGroup.fake_server_group.members),
+ TestServerGroup.fake_server_group.project_id,
+ TestServerGroup.fake_server_group.user_id,
+ ),)
+
+ def setUp(self):
+ super(TestServerGroupList, self).setUp()
+
+ self.server_groups_mock.list.return_value = [self.fake_server_group]
+ self.cmd = server_group.ListServerGroup(self.app, None)
+
+ def test_server_group_list(self):
+ arglist = []
+ verifylist = [
+ ('all_projects', False),
+ ('long', False),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+ self.server_groups_mock.list.assert_called_once_with(False)
+
+ self.assertEqual(self.list_columns, columns)
+ self.assertEqual(self.list_data, tuple(data))
+
+ def test_server_group_list_with_all_projects_and_long(self):
+ arglist = [
+ '--all-projects',
+ '--long',
+ ]
+ verifylist = [
+ ('all_projects', True),
+ ('long', True),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+ self.server_groups_mock.list.assert_called_once_with(True)
+
+ self.assertEqual(self.list_columns_long, columns)
+ self.assertEqual(self.list_data_long, tuple(data))
+
+
+class TestServerGroupShow(TestServerGroup):
+
+ def setUp(self):
+ super(TestServerGroupShow, self).setUp()
+
+ self.server_groups_mock.get.return_value = self.fake_server_group
+ self.cmd = server_group.ShowServerGroup(self.app, None)
+
+ def test_server_group_show(self):
+ arglist = [
+ 'affinity_group',
+ ]
+ verifylist = [
+ ('server_group', 'affinity_group'),
+ ]
+
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+ columns, data = self.cmd.take_action(parsed_args)
+
+ self.assertEqual(self.columns, columns)
+ self.assertEqual(self.data, data)