diff options
Diffstat (limited to 'openstackclient/tests')
14 files changed, 1371 insertions, 102 deletions
diff --git a/openstackclient/tests/functional/common/test_extension.py b/openstackclient/tests/functional/common/test_extension.py new file mode 100644 index 00000000..7c527eae --- /dev/null +++ b/openstackclient/tests/functional/common/test_extension.py @@ -0,0 +1,42 @@ +# Copyright (c) 2017, Intel Corporation. +# 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 json + +from openstackclient.tests.functional import base + + +class TestExtension(base.TestCase): + """Functional tests for extension.""" + + def test_extension_list(self): + """Test extension list.""" + json_output = json.loads(self.openstack( + 'extension list -f json ' + '--network') + ) + self.assertEqual( + 'Default Subnetpools', + json_output[0]['Name'], + ) + + def test_extension_show(self): + """Test extension show.""" + name = 'agent' + json_output = json.loads(self.openstack( + 'extension show -f json ' + name) + ) + self.assertEqual( + name, + json_output.get('Alias')) diff --git a/openstackclient/tests/functional/common/test_quota.py b/openstackclient/tests/functional/common/test_quota.py index c1de9aa9..8092b3ce 100644 --- a/openstackclient/tests/functional/common/test_quota.py +++ b/openstackclient/tests/functional/common/test_quota.py @@ -25,6 +25,27 @@ class QuotaTests(base.TestCase): cls.PROJECT_NAME =\ cls.get_openstack_configuration_value('auth.project_name') + def test_quota_list_network_option(self): + self.openstack('quota set --networks 40 ' + + self.PROJECT_NAME) + raw_output = self.openstack('quota list --network') + self.assertIsNotNone(raw_output) + self.assertIn("40", raw_output) + + def test_quota_list_compute_option(self): + self.openstack('quota set --instances 40 ' + + self.PROJECT_NAME) + raw_output = self.openstack('quota list --compute') + self.assertIsNotNone(raw_output) + self.assertIn("40", raw_output) + + def test_quota_list_volume_option(self): + self.openstack('quota set --backups 40 ' + + self.PROJECT_NAME) + raw_output = self.openstack('quota list --volume') + self.assertIsNotNone(raw_output) + self.assertIn("40", raw_output) + def test_quota_set(self): self.openstack('quota set --instances 11 --volumes 11 --networks 11 ' + self.PROJECT_NAME) diff --git a/openstackclient/tests/functional/network/v2/test_network_flavor_profile.py b/openstackclient/tests/functional/network/v2/test_network_flavor_profile.py new file mode 100644 index 00000000..1a82c82b --- /dev/null +++ b/openstackclient/tests/functional/network/v2/test_network_flavor_profile.py @@ -0,0 +1,151 @@ +# 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 json + +from openstackclient.tests.functional import base + + +class NetworkFlavorProfileTests(base.TestCase): + """Functional tests for network flavor-profile.""" + + DESCRIPTION = 'fakedescription' + METAINFO = 'Extrainfo' + + def test_network_flavor_profile_create(self): + json_output = json.loads(self.openstack( + ' network flavor profile create -f json --description ' + + self.DESCRIPTION + ' --enable --metainfo ' + self.METAINFO)) + ID = json_output.get('id') + self.assertIsNotNone(ID) + self.assertEqual( + True, + json_output.get('enabled')) + self.assertEqual( + 'fakedescription', + json_output.get('description')) + self.assertEqual( + 'Extrainfo', + json_output.get('meta_info') + ) + + # Clean up + raw_output = self.openstack('network flavor profile delete ' + ID) + self.assertOutput('', raw_output) + + def test_network_flavor_profile_list(self): + json_output = json.loads(self.openstack( + ' network flavor profile create -f json --description ' + + self.DESCRIPTION + ' --enable --metainfo ' + self.METAINFO)) + ID1 = json_output.get('id') + self.assertIsNotNone(ID1) + self.assertEqual( + True, + json_output.get('enabled')) + self.assertEqual( + 'fakedescription', + json_output.get('description')) + self.assertEqual( + 'Extrainfo', + json_output.get('meta_info') + ) + + json_output = json.loads(self.openstack( + ' network flavor profile create -f json --description ' + + self.DESCRIPTION + ' --disable --metainfo ' + self.METAINFO)) + ID2 = json_output.get('id') + self.assertIsNotNone(ID2) + self.assertEqual( + False, + json_output.get('enabled')) + self.assertEqual( + 'fakedescription', + json_output.get('description')) + self.assertEqual( + 'Extrainfo', + json_output.get('meta_info') + ) + + # Test list + json_output = json.loads(self.openstack( + 'network flavor profile list -f json')) + self.assertIsNotNone(json_output) + + id_list = [item.get('ID') for item in json_output] + self.assertIn(ID1, id_list) + self.assertIn(ID2, id_list) + + # Clean up + raw_output = self.openstack( + 'network flavor profile delete ' + ID1 + " " + ID2) + self.assertOutput('', raw_output) + + def test_network_flavor_profile_set(self): + json_output_1 = json.loads(self.openstack( + ' network flavor profile create -f json --description ' + + self.DESCRIPTION + ' --enable --metainfo ' + self.METAINFO)) + ID = json_output_1.get('id') + self.assertIsNotNone(ID) + self.assertEqual( + True, + json_output_1.get('enabled')) + self.assertEqual( + 'fakedescription', + json_output_1.get('description')) + self.assertEqual( + 'Extrainfo', + json_output_1.get('meta_info') + ) + + self.openstack('network flavor profile set --disable ' + ID) + + json_output = json.loads(self.openstack('network flavor profile show ' + '-f json ' + ID)) + self.assertEqual( + False, + json_output.get('enabled')) + self.assertEqual( + 'fakedescription', + json_output.get('description')) + self.assertEqual( + 'Extrainfo', + json_output.get('meta_info') + ) + + # Clean up + raw_output = self.openstack('network flavor profile delete ' + ID) + self.assertOutput('', raw_output) + + def test_network_flavor_profile_show(self): + json_output_1 = json.loads(self.openstack( + ' network flavor profile create -f json --description ' + + self.DESCRIPTION + ' --enable --metainfo ' + self.METAINFO)) + ID = json_output_1.get('id') + self.assertIsNotNone(ID) + json_output = json.loads(self.openstack('network flavor profile show ' + '-f json ' + ID)) + self.assertEqual( + ID, + json_output["id"]) + self.assertEqual( + True, + json_output["enabled"]) + self.assertEqual( + 'fakedescription', + json_output["description"]) + self.assertEqual( + 'Extrainfo', + json_output["meta_info"]) + + # Clean up + raw_output = self.openstack('network flavor profile delete ' + ID) + self.assertOutput('', raw_output) diff --git a/openstackclient/tests/functional/network/v2/test_network_meter.py b/openstackclient/tests/functional/network/v2/test_network_meter.py index 7dce34e7..f73f4812 100644 --- a/openstackclient/tests/functional/network/v2/test_network_meter.py +++ b/openstackclient/tests/functional/network/v2/test_network_meter.py @@ -13,7 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. -import re +import json import uuid from openstackclient.tests.functional import base @@ -27,37 +27,45 @@ class TestMeter(base.TestCase): # has its own needs and there are collisions when running # tests in parallel. - @classmethod - def setUpClass(cls): - # Set up some regex for matching below - cls.re_name = re.compile("name\s+\|\s+([^|]+?)\s+\|") - cls.re_shared = re.compile("shared\s+\|\s+(\S+)") - cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|") - def test_meter_delete(self): """Test create, delete multiple""" name1 = uuid.uuid4().hex name2 = uuid.uuid4().hex - - raw_output = self.openstack( - 'network meter create ' + name1, + description = 'fakedescription' + json_output = json.loads(self.openstack( + 'network meter create -f json ' + name1 + ' --description ' + + description) ) self.assertEqual( name1, - re.search(self.re_name, raw_output).group(1), + json_output.get('name'), ) # Check if default shared values self.assertEqual( - 'False', - re.search(self.re_shared, raw_output).group(1) + False, + json_output.get('shared') + ) + self.assertEqual( + 'fakedescription', + json_output.get('description') ) - raw_output = self.openstack( - 'network meter create ' + name2, + json_output_2 = json.loads(self.openstack( + 'network meter create -f json ' + name2 + ' --description ' + + description) ) self.assertEqual( name2, - re.search(self.re_name, raw_output).group(1), + json_output_2.get('name'), + ) + # Check if default shared values + self.assertEqual( + False, + json_output_2.get('shared') + ) + self.assertEqual( + 'fakedescription', + json_output_2.get('description') ) raw_output = self.openstack( @@ -68,35 +76,83 @@ class TestMeter(base.TestCase): def test_meter_list(self): """Test create, list filters, delete""" name1 = uuid.uuid4().hex - raw_output = self.openstack( - 'network meter create --description Test1 --share ' + name1, + json_output = json.loads(self.openstack( + 'network meter create -f json --description Test1 --share ' + + name1) ) self.addCleanup(self.openstack, 'network meter delete ' + name1) self.assertEqual( 'Test1', - re.search(self.re_description, raw_output).group(1), + json_output.get('description'), ) self.assertEqual( - 'True', - re.search(self.re_shared, raw_output).group(1), + True, + json_output.get('shared'), ) name2 = uuid.uuid4().hex - raw_output = self.openstack( - 'network meter create --description Test2 --no-share ' + name2, + json_output_2 = json.loads(self.openstack( + 'network meter create -f json --description Test2 --no-share ' + + name2) ) self.addCleanup(self.openstack, 'network meter delete ' + name2) self.assertEqual( 'Test2', - re.search(self.re_description, raw_output).group(1), + json_output_2.get('description') + ) + self.assertEqual( + False, + json_output_2.get('shared') + ) + + raw_output = json.loads(self.openstack('network meter list -f json')) + name_list = [item.get('Name') for item in raw_output] + self.assertIn(name1, name_list) + self.assertIn(name2, name_list) + + def test_meter_show(self): + """Test create, show, delete""" + name1 = uuid.uuid4().hex + description = 'fakedescription' + json_output = json.loads(self.openstack( + 'network meter create -f json ' + name1 + ' --description ' + + description) + ) + meter_id = json_output.get('id') + self.addCleanup(self.openstack, 'network meter delete ' + name1) + + # Test show with ID + json_output = json.loads(self.openstack( + 'network meter show -f json ' + meter_id) ) self.assertEqual( - 'False', - re.search(self.re_shared, raw_output).group(1), + False, + json_output.get('shared') + ) + self.assertEqual( + 'fakedescription', + json_output.get('description') + ) + self.assertEqual( + name1, + json_output.get('name') ) - raw_output = self.openstack('network meter list') - self.assertIsNotNone(re.search(name1 + "\s+\|\s+Test1", raw_output)) - self.assertIsNotNone(re.search(name2 + "\s+\|\s+Test2", raw_output)) + # Test show with name + json_output = json.loads(self.openstack( + 'network meter show -f json ' + name1) + ) + self.assertEqual( + meter_id, + json_output.get('id') + ) + self.assertEqual( + False, + json_output.get('shared') + ) + self.assertEqual( + 'fakedescription', + json_output.get('description') + ) diff --git a/openstackclient/tests/functional/network/v2/test_network_meter_rule.py b/openstackclient/tests/functional/network/v2/test_network_meter_rule.py index 4f079e3c..d15cdf77 100644 --- a/openstackclient/tests/functional/network/v2/test_network_meter_rule.py +++ b/openstackclient/tests/functional/network/v2/test_network_meter_rule.py @@ -13,7 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. -import re +import json import uuid from openstackclient.tests.functional import base @@ -27,19 +27,11 @@ class TestMeterRule(base.TestCase): @classmethod def setUpClass(cls): - # Set up some regex for matching below - cls.re_id = re.compile("id\s+\|\s+(\S+)") - cls.re_direction = re.compile("direction\s+\|\s+(\S+)") - cls.re_ip_prefix = re.compile( - "remote_ip_prefix\s+\|\s+([^|]+?)\s+\|" - ) - cls.re_meter_id = re.compile("metering_label_id\s+\|\s+(\S+)") - - raw_output = cls.openstack( - 'network meter create ' + cls.METER_NAME - ) + json_output = json.loads(cls.openstack( + 'network meter create -f json ' + cls.METER_NAME + )) - cls.METER_ID = re.search(cls.re_id, raw_output).group(1) + cls.METER_ID = json_output.get('id') @classmethod def tearDownClass(cls): @@ -49,58 +41,81 @@ class TestMeterRule(base.TestCase): def test_meter_rule_delete(self): """test create, delete""" - raw_output = self.openstack( - 'network meter rule create ' + + json_output = json.loads(self.openstack( + 'network meter rule create -f json ' + '--remote-ip-prefix 10.0.0.0/8 ' + self.METER_ID - ) - rule_id = re.search(self.re_id, raw_output).group(1) - re_ip = re.search(self.re_ip_prefix, raw_output) + )) + rule_id = json_output.get('id') + re_ip = json_output.get('remote_ip_prefix') self.addCleanup(self.openstack, 'network meter rule delete ' + rule_id) self.assertIsNotNone(re_ip) self.assertIsNotNone(rule_id) + self.assertEqual( + '10.0.0.0/8', re_ip + ) def test_meter_rule_list(self): """Test create, list, delete""" - raw_output = self.openstack( - 'network meter rule create ' + + json_output = json.loads(self.openstack( + 'network meter rule create -f json ' + '--remote-ip-prefix 10.0.0.0/8 ' + self.METER_ID - ) - rule_id = re.search(self.re_id, raw_output).group(1) + )) + rule_id_1 = json_output.get('id') self.addCleanup(self.openstack, - 'network meter rule delete ' + rule_id) + 'network meter rule delete ' + rule_id_1) self.assertEqual( '10.0.0.0/8', - re.search(self.re_ip_prefix, raw_output).group(1) + json_output.get('remote_ip_prefix') ) - raw_output = self.openstack('network meter rule list') - self.assertIsNotNone(re.search(rule_id + "|\s+\|\s+\|\s+10.0.0.0/8", - raw_output)) + json_output_1 = json.loads(self.openstack( + 'network meter rule create -f json ' + + '--remote-ip-prefix 11.0.0.0/8 ' + + self.METER_ID + )) + rule_id_2 = json_output_1.get('id') + self.addCleanup(self.openstack, + 'network meter rule delete ' + rule_id_2) + self.assertEqual( + '11.0.0.0/8', + json_output_1.get('remote_ip_prefix') + ) + + json_output = json.loads(self.openstack('network meter rule list -f ' + 'json')) + rule_id_list = [item.get('ID') for item in json_output] + ip_prefix_list = [item.get('Remote IP Prefix') for item in json_output] + self.assertIn(rule_id_1, rule_id_list) + self.assertIn(rule_id_2, rule_id_list) + self.assertIn('10.0.0.0/8', ip_prefix_list) + self.assertIn('11.0.0.0/8', ip_prefix_list) def test_meter_rule_show(self): + """Test create, show, delete""" - raw_output = self.openstack( - 'network meter rule create ' + + json_output = json.loads(self.openstack( + 'network meter rule create -f json ' + '--remote-ip-prefix 10.0.0.0/8 ' + '--egress ' + self.METER_ID - ) - rule_id = re.search(self.re_id, raw_output).group(1) + )) + rule_id = json_output.get('id') self.assertEqual( 'egress', - re.search(self.re_direction, raw_output).group(1) + json_output.get('direction') ) - raw_output = self.openstack('network meter rule show ' + rule_id) + json_output = json.loads(self.openstack('network meter rule show' + ' -f json ' + rule_id)) self.assertEqual( '10.0.0.0/8', - re.search(self.re_ip_prefix, raw_output).group(1) + json_output.get('remote_ip_prefix') ) self.assertIsNotNone(rule_id) diff --git a/openstackclient/tests/unit/common/test_extension.py b/openstackclient/tests/unit/common/test_extension.py index bf856ed1..68fdf17d 100644 --- a/openstackclient/tests/unit/common/test_extension.py +++ b/openstackclient/tests/unit/common/test_extension.py @@ -19,6 +19,7 @@ from openstackclient.tests.unit import fakes from openstackclient.tests.unit.identity.v2_0 import fakes as identity_fakes from openstackclient.tests.unit.network.v2 import fakes as network_fakes from openstackclient.tests.unit import utils +from openstackclient.tests.unit import utils as tests_utils from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes @@ -242,3 +243,60 @@ class TestExtensionList(TestExtension): ), ) self._test_extension_list_helper(arglist, verifylist, datalist) self.volume_extensions_mock.show_all.assert_called_with() + + +class TestExtensionShow(TestExtension): + extension_details = ( + network_fakes.FakeExtension.create_one_extension() + ) + + columns = ( + 'Alias', + 'Description', + 'Links', + 'Name', + 'Namespace', + 'Updated' + ) + + data = ( + extension_details.alias, + extension_details.description, + extension_details.links, + extension_details.name, + extension_details.namespace, + extension_details.updated + ) + + def setUp(self): + super(TestExtensionShow, self).setUp() + + self.cmd = extension.ShowExtension(self.app, None) + + self.app.client_manager.network.find_extension = mock.Mock( + return_value=self.extension_details) + + def test_show_no_options(self): + arglist = [] + verifylist = [] + + self.assertRaises(tests_utils.ParserException, self.check_parser, + self.cmd, arglist, verifylist) + + def test_show_all_options(self): + arglist = [ + self.extension_details.alias, + ] + verifylist = [ + ('extension', self.extension_details.alias), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.app.client_manager.network.find_extension.assert_called_with( + self.extension_details.alias) + + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) diff --git a/openstackclient/tests/unit/common/test_quota.py b/openstackclient/tests/unit/common/test_quota.py index 7dd23373..63f6435f 100644 --- a/openstackclient/tests/unit/common/test_quota.py +++ b/openstackclient/tests/unit/common/test_quota.py @@ -17,6 +17,7 @@ from openstackclient.common import quota from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes from openstackclient.tests.unit import fakes from openstackclient.tests.unit.identity.v2_0 import fakes as identity_fakes +from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3 from openstackclient.tests.unit.network.v2 import fakes as network_fakes from openstackclient.tests.unit.volume.v2 import fakes as volume_fakes @@ -518,3 +519,161 @@ class TestQuotaShow(TestQuota): self.network.get_quota.assert_called_once_with( identity_fakes.project_id) self.assertNotCalled(self.network.get_quota_default) + + +class TestQuotaList(TestQuota): + """Test cases for quota list command""" + + project = identity_fakes_v3.FakeProject.create_one_project() + + quota_list = network_fakes.FakeQuota.create_one_net_quota() + quota_list1 = compute_fakes.FakeQuota.create_one_comp_quota() + quota_list2 = volume_fakes.FakeQuota.create_one_vol_quota() + + default_quota = network_fakes.FakeQuota.create_one_default_net_quota() + default_quota1 = compute_fakes.FakeQuota.create_one_default_comp_quota() + default_quota2 = volume_fakes.FakeQuota.create_one_default_vol_quota() + + reference_data = (project.id, + quota_list.floating_ips, + quota_list.networks, + quota_list.ports, + quota_list.rbac_policies, + quota_list.routers, + quota_list.security_groups, + quota_list.security_group_rules, + quota_list.subnets, + quota_list.subnet_pools) + + comp_reference_data = (project.id, + quota_list1.cores, + quota_list1.fixed_ips, + quota_list1.injected_files, + quota_list1.injected_file_content_bytes, + quota_list1.injected_file_path_bytes, + quota_list1.instances, + quota_list1.key_pairs, + quota_list1.metadata_items, + quota_list1.ram, + quota_list1.server_groups, + quota_list1.server_group_members) + + vol_reference_data = (project.id, + quota_list2.backups, + quota_list2.backup_gigabytes, + quota_list2.gigabytes, + quota_list2.per_volume_gigabytes, + quota_list2.snapshots, + quota_list2.volumes) + + net_column_header = ( + 'Project ID', + 'Floating IPs', + 'Networks', + 'Ports', + 'RBAC Policies', + 'Routers', + 'Security Groups', + 'Security Group Rules', + 'Subnets', + 'Subnet Pools' + ) + + comp_column_header = ( + 'Project ID', + 'Cores', + 'Fixed IPs', + 'Injected Files', + 'Injected File Content Bytes', + 'Injected File Path Bytes', + 'Instances', + 'Key Pairs', + 'Metadata Items', + 'Ram', + 'Server Groups', + 'Server Group Members', + ) + + vol_column_header = ( + 'Project ID', + 'Backups', + 'Backup Gigabytes', + 'Gigabytes', + 'Per Volume Gigabytes', + 'Snapshots', + 'Volumes', + ) + + def setUp(self): + super(TestQuotaList, self).setUp() + + self.projects_mock.get.return_value = fakes.FakeResource( + None, + copy.deepcopy(identity_fakes.PROJECT), + loaded=True, + ) + + self.identity = self.app.client_manager.identity + self.identity.tenants.list = mock.Mock(return_value=[self.project]) + + self.network = self.app.client_manager.network + self.compute = self.app.client_manager.compute + self.volume = self.app.client_manager.volume + + self.network.get_quota = mock.Mock(return_value=self.quota_list) + self.compute.quotas.get = mock.Mock(return_value=self.quota_list1) + self.volume.quotas.get = mock.Mock(return_value=self.quota_list2) + + self.network.get_quota_default = mock.Mock( + return_value=self.default_quota) + self.compute.quotas.defaults = mock.Mock( + return_value=self.default_quota1) + self.volume.quotas.defaults = mock.Mock( + return_value=self.default_quota2) + + self.cmd = quota.ListQuota(self.app, None) + + def test_quota_list_network(self): + arglist = [ + '--network' + ] + verifylist = [ + ('network', True) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.net_column_header, columns) + + self.assertEqual(self.reference_data, list(data)[0]) + + def test_quota_list_compute(self): + arglist = [ + '--compute' + ] + verifylist = [ + ('compute', True) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.comp_column_header, columns) + + self.assertEqual(self.comp_reference_data, list(data)[0]) + + def test_quota_list_volume(self): + arglist = [ + '--volume' + ] + verifylist = [ + ('volume', True) + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.vol_column_header, columns) + + self.assertEqual(self.vol_reference_data, list(data)[0]) diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py index bbb770bb..4a194859 100644 --- a/openstackclient/tests/unit/compute/v2/fakes.py +++ b/openstackclient/tests/unit/compute/v2/fakes.py @@ -1357,3 +1357,67 @@ class FakeUsage(object): usages.append(FakeUsage.create_one_usage(attrs)) return usages + + +class FakeQuota(object): + """Fake quota""" + + @staticmethod + def create_one_comp_quota(attrs=None): + """Create one quota""" + + attrs = attrs or {} + + quota_attrs = { + 'id': 'project-id-' + uuid.uuid4().hex, + 'cores': 20, + 'fixed_ips': 30, + 'injected_files': 100, + 'injected_file_content_bytes': 10240, + 'injected_file_path_bytes': 255, + 'instances': 50, + 'key_pairs': 20, + 'metadata_items': 10, + 'ram': 51200, + 'server_groups': 10, + 'server_group_members': 10 + } + + quota_attrs.update(attrs) + quota = fakes.FakeResource( + info=copy.deepcopy(quota_attrs), + loaded=True) + + quota.project_id = quota_attrs['id'] + + return quota + + @staticmethod + def create_one_default_comp_quota(attrs=None): + """Crate one quota""" + + attrs = attrs or {} + + quota_attrs = { + 'id': 'project-id-' + uuid.uuid4().hex, + 'cores': 10, + 'fixed_ips': 10, + 'injected_files': 100, + 'injected_file_content_bytes': 10240, + 'injected_file_path_bytes': 255, + 'instances': 20, + 'key_pairs': 20, + 'metadata_items': 10, + 'ram': 51200, + 'server_groups': 10, + 'server_group_members': 10 + } + + quota_attrs.update(attrs) + quota = fakes.FakeResource( + info=copy.deepcopy(quota_attrs), + loaded=True) + + quota.project_id = quota_attrs['id'] + + return quota diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py index 5020dd2e..7691ef59 100644 --- a/openstackclient/tests/unit/compute/v2/test_server.py +++ b/openstackclient/tests/unit/compute/v2/test_server.py @@ -146,24 +146,33 @@ class TestServerAddFloatingIP(TestServer): 'add_floating_ip': None, } - def test_server_add_floating_ip(self): + def _test_server_add_floating_ip(self, extralist, fixed_ip_address): servers = self.setup_servers_mock(count=1) arglist = [ servers[0].id, '1.2.3.4', - ] + ] + extralist verifylist = [ ('server', servers[0].id), ('ip_address', '1.2.3.4'), + ('fixed_ip_address', fixed_ip_address), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - servers[0].add_floating_ip.assert_called_once_with('1.2.3.4') + servers[0].add_floating_ip.assert_called_once_with('1.2.3.4', + fixed_ip_address) self.assertIsNone(result) + def test_server_add_floating_ip(self): + self._test_server_add_floating_ip([], None) + + def test_server_add_floating_ip_to_fixed_ip(self): + extralist = ['--fixed-ip-address', '5.6.7.8'] + self._test_server_add_floating_ip(extralist, '5.6.7.8') + class TestServerAddSecurityGroup(TestServer): diff --git a/openstackclient/tests/unit/identity/v3/fakes.py b/openstackclient/tests/unit/identity/v3/fakes.py index 01b5dede..139d90d5 100644 --- a/openstackclient/tests/unit/identity/v3/fakes.py +++ b/openstackclient/tests/unit/identity/v3/fakes.py @@ -770,6 +770,44 @@ class FakeUser(object): loaded=True) return user + @staticmethod + def create_users(attrs=None, count=2): + """Create multiple fake users. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of users to fake + :return: + A list of FakeResource objects faking the users + """ + users = [] + for i in range(0, count): + user = FakeUser.create_one_user(attrs) + users.append(user) + + return users + + @staticmethod + def get_users(users=None, count=2): + """Get an iterable MagicMock object with a list of faked users. + + If users list is provided, then initialize the Mock object with + the list. Otherwise create one. + + :param List users: + A list of FakeResource objects faking users + :param Integer count: + The number of users to be faked + :return + An iterable Mock object with side_effect set to a list of faked + users + """ + if users is None: + users = FakeUser.create_users(count) + + return mock.Mock(side_effect=users) + class FakeGroup(object): """Fake one or more group.""" diff --git a/openstackclient/tests/unit/identity/v3/test_group.py b/openstackclient/tests/unit/identity/v3/test_group.py index 5870e1db..81722631 100644 --- a/openstackclient/tests/unit/identity/v3/test_group.py +++ b/openstackclient/tests/unit/identity/v3/test_group.py @@ -42,47 +42,78 @@ class TestGroup(identity_fakes.TestIdentityv3): class TestGroupAddUser(TestGroup): - group = identity_fakes.FakeGroup.create_one_group() - user = identity_fakes.FakeUser.create_one_user() + _group = identity_fakes.FakeGroup.create_one_group() + users = identity_fakes.FakeUser.create_users(count=2) def setUp(self): super(TestGroupAddUser, self).setUp() - self.groups_mock.get.return_value = self.group - self.users_mock.get.return_value = self.user + self.groups_mock.get.return_value = self._group + self.users_mock.get = ( + identity_fakes.FakeUser.get_users(self.users)) self.users_mock.add_to_group.return_value = None self.cmd = group.AddUserToGroup(self.app, None) def test_group_add_user(self): arglist = [ - self.group.name, - self.user.name, + self._group.name, + self.users[0].name, ] verifylist = [ - ('group', self.group.name), - ('user', self.user.name), + ('group', self._group.name), + ('user', [self.users[0].name]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.users_mock.add_to_group.assert_called_once_with( - self.user.id, self.group.id) + self.users[0].id, self._group.id) self.assertIsNone(result) - def test_group_add_user_with_error(self): - self.users_mock.add_to_group.side_effect = exceptions.CommandError() + def test_group_add_multi_users(self): arglist = [ - self.group.name, - self.user.name, + self._group.name, + self.users[0].name, + self.users[1].name, ] verifylist = [ - ('group', self.group.name), - ('user', self.user.name), + ('group', self._group.name), + ('user', [self.users[0].name, self.users[1].name]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, - self.cmd.take_action, parsed_args) + + result = self.cmd.take_action(parsed_args) + calls = [call(self.users[0].id, self._group.id), + call(self.users[1].id, self._group.id)] + self.users_mock.add_to_group.assert_has_calls(calls) + self.assertIsNone(result) + + @mock.patch.object(group.LOG, 'error') + def test_group_add_user_with_error(self, mock_error): + self.users_mock.add_to_group.side_effect = [ + exceptions.CommandError(), None] + arglist = [ + self._group.name, + self.users[0].name, + self.users[1].name, + ] + verifylist = [ + ('group', self._group.name), + ('user', [self.users[0].name, self.users[1].name]), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + try: + self.cmd.take_action(parsed_args) + self.fail('CommandError should be raised.') + except exceptions.CommandError as e: + msg = "1 of 2 users not added to group %s." % self._group.name + self.assertEqual(msg, str(e)) + msg = ("%(user)s not added to group %(group)s: ") % { + 'user': self.users[0].name, + 'group': self._group.name, + } + mock_error.assert_called_once_with(msg) class TestGroupCheckUser(TestGroup): @@ -463,48 +494,78 @@ class TestGroupList(TestGroup): class TestGroupRemoveUser(TestGroup): - group = identity_fakes.FakeGroup.create_one_group() - user = identity_fakes.FakeUser.create_one_user() + _group = identity_fakes.FakeGroup.create_one_group() + users = identity_fakes.FakeUser.create_users(count=2) def setUp(self): super(TestGroupRemoveUser, self).setUp() - self.groups_mock.get.return_value = self.group - self.users_mock.get.return_value = self.user + self.groups_mock.get.return_value = self._group + self.users_mock.get = ( + identity_fakes.FakeUser.get_users(self.users)) self.users_mock.remove_from_group.return_value = None self.cmd = group.RemoveUserFromGroup(self.app, None) def test_group_remove_user(self): arglist = [ - self.group.id, - self.user.id, + self._group.id, + self.users[0].id, ] verifylist = [ - ('group', self.group.id), - ('user', self.user.id), + ('group', self._group.id), + ('user', [self.users[0].id]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.users_mock.remove_from_group.assert_called_once_with( - self.user.id, self.group.id) + self.users[0].id, self._group.id) self.assertIsNone(result) - def test_group_remove_user_with_error(self): - self.users_mock.remove_from_group.side_effect = ( - exceptions.CommandError()) + def test_group_remove_multi_users(self): arglist = [ - self.group.id, - self.user.id, + self._group.name, + self.users[0].name, + self.users[1].name, ] verifylist = [ - ('group', self.group.id), - ('user', self.user.id), + ('group', self._group.name), + ('user', [self.users[0].name, self.users[1].name]), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - self.assertRaises(exceptions.CommandError, - self.cmd.take_action, parsed_args) + + result = self.cmd.take_action(parsed_args) + calls = [call(self.users[0].id, self._group.id), + call(self.users[1].id, self._group.id)] + self.users_mock.remove_from_group.assert_has_calls(calls) + self.assertIsNone(result) + + @mock.patch.object(group.LOG, 'error') + def test_group_remove_user_with_error(self, mock_error): + self.users_mock.remove_from_group.side_effect = [ + exceptions.CommandError(), None] + arglist = [ + self._group.id, + self.users[0].id, + self.users[1].id, + ] + verifylist = [ + ('group', self._group.id), + ('user', [self.users[0].id, self.users[1].id]), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + try: + self.cmd.take_action(parsed_args) + self.fail('CommandError should be raised.') + except exceptions.CommandError as e: + msg = "1 of 2 users not removed from group %s." % self._group.id + self.assertEqual(msg, str(e)) + msg = ("%(user)s not removed from group %(group)s: ") % { + 'user': self.users[0].id, + 'group': self._group.id, + } + mock_error.assert_called_once_with(msg) class TestGroupSet(TestGroup): diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py index e0ee05b4..d3685409 100644 --- a/openstackclient/tests/unit/network/v2/fakes.py +++ b/openstackclient/tests/unit/network/v2/fakes.py @@ -769,6 +769,53 @@ class FakeNetworkRBAC(object): return mock.Mock(side_effect=rbac_policies) +class FakeNetworkFlavorProfile(object): + """Fake network flavor profile.""" + + @staticmethod + def create_one_service_profile(attrs=None): + """Create flavor profile.""" + attrs = attrs or {} + + flavor_profile_attrs = { + 'id': 'flavor-profile-id' + uuid.uuid4().hex, + 'description': 'flavor-profile-description-' + uuid.uuid4().hex, + 'tenant_id': 'project-id-' + uuid.uuid4().hex, + 'driver': 'driver-' + uuid.uuid4().hex, + 'metainfo': 'metainfo-' + uuid.uuid4().hex, + 'enabled': True + } + + flavor_profile_attrs.update(attrs) + + flavor_profile = fakes.FakeResource( + info=copy.deepcopy(flavor_profile_attrs), + loaded=True) + + flavor_profile.project_id = flavor_profile_attrs['tenant_id'] + flavor_profile.is_enabled = flavor_profile_attrs['enabled'] + + return flavor_profile + + @staticmethod + def create_service_profile(attrs=None, count=2): + """Create multiple flavor profiles.""" + + flavor_profiles = [] + for i in range(0, count): + flavor_profiles.append(FakeNetworkFlavorProfile. + create_one_service_profile(attrs)) + return flavor_profiles + + @staticmethod + def get_service_profile(flavor_profile=None, count=2): + """Get a list of flavor profiles.""" + if flavor_profile is None: + flavor_profile = (FakeNetworkFlavorProfile. + create_service_profile(count)) + return mock.Mock(side_effect=flavor_profile) + + class FakeNetworkQosPolicy(object): """Fake one or more QoS policies.""" @@ -1582,3 +1629,53 @@ class FakeNetworkServiceProvider(object): create_one_network_service_provider( attrs)) return service_providers + + +class FakeQuota(object): + """Fake quota""" + + @staticmethod + def create_one_net_quota(attrs=None): + """Create one quota""" + attrs = attrs or {} + + quota_attrs = { + 'floating_ips': 20, + 'networks': 25, + 'ports': 11, + 'rbac_policies': 15, + 'routers': 40, + 'security_groups': 10, + 'security_group_rules': 100, + 'subnets': 20, + 'subnet_pools': 30} + + quota_attrs.update(attrs) + + quota = fakes.FakeResource( + info=copy.deepcopy(quota_attrs), + loaded=True) + return quota + + @staticmethod + def create_one_default_net_quota(attrs=None): + """Create one quota""" + attrs = attrs or {} + + quota_attrs = { + 'floatingip': 30, + 'network': 20, + 'port': 10, + 'rbac_policy': 25, + 'router': 30, + 'security_group': 30, + 'security_group_rule': 200, + 'subnet': 10, + 'subnetpool': 20} + + quota_attrs.update(attrs) + + quota = fakes.FakeResource( + info=copy.deepcopy(quota_attrs), + loaded=True) + return quota diff --git a/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py b/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py new file mode 100644 index 00000000..91683241 --- /dev/null +++ b/openstackclient/tests/unit/network/v2/test_network_flavor_profile.py @@ -0,0 +1,448 @@ +# 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 osc_lib import exceptions + +from openstackclient.network.v2 import network_flavor_profile +from openstackclient.tests.unit.identity.v3 import fakes as identity_fakes_v3 +from openstackclient.tests.unit.network.v2 import fakes as network_fakes + + +class TestFlavorProfile(network_fakes.TestNetworkV2): + + def setUp(self): + super(TestFlavorProfile, self).setUp() + # Get the network client + self.network = self.app.client_manager.network + # Get the ProjectManager Mock + self.projects_mock = self.app.client_manager.identity.projects + # Get the DomainManager Mock + self.domains_mock = self.app.client_manager.identity.domains + + +class TestCreateFlavorProfile(TestFlavorProfile): + project = identity_fakes_v3.FakeProject.create_one_project() + domain = identity_fakes_v3.FakeDomain.create_one_domain() + new_flavor_profile = ( + network_fakes.FakeNetworkFlavorProfile. + create_one_service_profile() + ) + columns = ( + 'description', + 'driver', + 'enabled', + 'id', + 'metainfo', + 'project_id', + ) + + data = ( + new_flavor_profile.description, + new_flavor_profile.driver, + new_flavor_profile.enabled, + new_flavor_profile.id, + new_flavor_profile.metainfo, + new_flavor_profile.project_id, + ) + + def setUp(self): + super(TestCreateFlavorProfile, self).setUp() + self.network.create_service_profile = mock.Mock( + return_value=self.new_flavor_profile) + self.projects_mock.get.return_value = self.project + # Get the command object to test + self.cmd = (network_flavor_profile.CreateNetworkFlavorProfile( + self.app, self.namespace)) + + def test_create_all_options(self): + arglist = [ + "--description", self.new_flavor_profile.description, + "--project", self.new_flavor_profile.project_id, + '--project-domain', self.domain.name, + "--enable", + "--driver", self.new_flavor_profile.driver, + "--metainfo", self.new_flavor_profile.metainfo, + ] + + verifylist = [ + ('description', self.new_flavor_profile.description), + ('project', self.new_flavor_profile.project_id), + ('project_domain', self.domain.name), + ('enable', True), + ('driver', self.new_flavor_profile.driver), + ('metainfo', self.new_flavor_profile.metainfo) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = (self.cmd.take_action(parsed_args)) + + self.network.create_service_profile.assert_called_once_with( + **{'description': self.new_flavor_profile.description, + 'tenant_id': self.project.id, + 'enabled': self.new_flavor_profile.enabled, + 'driver': self.new_flavor_profile.driver, + 'metainfo': self.new_flavor_profile.metainfo} + ) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_create_with_metainfo(self): + arglist = [ + "--description", self.new_flavor_profile.description, + "--project", self.new_flavor_profile.project_id, + '--project-domain', self.domain.name, + "--enable", + "--metainfo", self.new_flavor_profile.metainfo, + ] + + verifylist = [ + ('description', self.new_flavor_profile.description), + ('project', self.new_flavor_profile.project_id), + ('project_domain', self.domain.name), + ('enable', True), + ('metainfo', self.new_flavor_profile.metainfo) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = (self.cmd.take_action(parsed_args)) + + self.network.create_service_profile.assert_called_once_with( + **{'description': self.new_flavor_profile.description, + 'tenant_id': self.project.id, + 'enabled': self.new_flavor_profile.enabled, + 'metainfo': self.new_flavor_profile.metainfo} + ) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_create_with_driver(self): + arglist = [ + "--description", self.new_flavor_profile.description, + "--project", self.new_flavor_profile.project_id, + '--project-domain', self.domain.name, + "--enable", + "--driver", self.new_flavor_profile.driver, + ] + + verifylist = [ + ('description', self.new_flavor_profile.description), + ('project', self.new_flavor_profile.project_id), + ('project_domain', self.domain.name), + ('enable', True), + ('driver', self.new_flavor_profile.driver), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = (self.cmd.take_action(parsed_args)) + + self.network.create_service_profile.assert_called_once_with( + **{'description': self.new_flavor_profile.description, + 'tenant_id': self.project.id, + 'enabled': self.new_flavor_profile.enabled, + 'driver': self.new_flavor_profile.driver, + } + ) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + def test_create_without_driver_and_metainfo(self): + arglist = [ + "--description", self.new_flavor_profile.description, + "--project", self.new_flavor_profile.project_id, + '--project-domain', self.domain.name, + "--enable", + ] + + verifylist = [ + ('description', self.new_flavor_profile.description), + ('project', self.new_flavor_profile.project_id), + ('project_domain', self.domain.name), + ('enable', True), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.assertRaises( + exceptions.CommandError, + self.cmd.take_action, + parsed_args, + ) + + def test_create_disable(self): + arglist = [ + '--disable', + '--driver', self.new_flavor_profile.driver, + ] + verifylist = [ + ('disable', True), + ('driver', self.new_flavor_profile.driver) + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.network.create_service_profile.assert_called_once_with(**{ + 'enabled': False, + 'driver': self.new_flavor_profile.driver, + }) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + +class TestDeleteFlavorProfile(TestFlavorProfile): + + # The network flavor_profiles to delete. + _network_flavor_profiles = ( + network_fakes.FakeNetworkFlavorProfile.create_service_profile(count=2)) + + def setUp(self): + super(TestDeleteFlavorProfile, self).setUp() + self.network.delete_service_profile = mock.Mock(return_value=None) + self.network.find_service_profile = ( + network_fakes.FakeNetworkFlavorProfile.get_service_profile( + flavor_profile=self._network_flavor_profiles) + ) + + # Get the command object to test + self.cmd = network_flavor_profile.DeleteNetworkFlavorProfile( + self.app, self.namespace) + + def test_network_flavor_profile_delete(self): + arglist = [ + self._network_flavor_profiles[0].id, + ] + verifylist = [ + ('flavor_profile', [self._network_flavor_profiles[0].id]), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + self.network.find_service_profile.assert_called_once_with( + self._network_flavor_profiles[0].id, ignore_missing=False) + self.network.delete_service_profile.assert_called_once_with( + self._network_flavor_profiles[0]) + self.assertIsNone(result) + + def test_multi_network_flavor_profiles_delete(self): + arglist = [] + + for a in self._network_flavor_profiles: + arglist.append(a.id) + verifylist = [ + ('flavor_profile', arglist), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + calls = [] + for a in self._network_flavor_profiles: + calls.append(mock.call(a)) + self.network.delete_service_profile.assert_has_calls(calls) + self.assertIsNone(result) + + def test_multi_network_flavor_profiles_delete_with_exception(self): + arglist = [ + self._network_flavor_profiles[0].id, + 'unexist_network_flavor_profile', + ] + verifylist = [ + ('flavor_profile', + [self._network_flavor_profiles[0].id, + 'unexist_network_flavor_profile']), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + find_mock_result = [self._network_flavor_profiles[0], + exceptions.CommandError] + self.network.find_service_profile = ( + mock.Mock(side_effect=find_mock_result) + ) + + try: + self.cmd.take_action(parsed_args) + self.fail('CommandError should be raised.') + except exceptions.CommandError as e: + self.assertEqual('1 of 2 flavor_profiles failed to delete.', + str(e)) + + self.network.find_service_profile.assert_any_call( + self._network_flavor_profiles[0].id, ignore_missing=False) + self.network.find_service_profile.assert_any_call( + 'unexist_network_flavor_profile', ignore_missing=False) + self.network.delete_service_profile.assert_called_once_with( + self._network_flavor_profiles[0] + ) + + +class TestListFlavorProfile(TestFlavorProfile): + + # The network flavor profiles list + _network_flavor_profiles = ( + network_fakes.FakeNetworkFlavorProfile.create_service_profile(count=2)) + + columns = ( + 'ID', + 'Driver', + 'Enabled', + 'Metainfo', + 'Description', + ) + data = [] + for flavor_profile in _network_flavor_profiles: + data.append(( + flavor_profile.id, + flavor_profile.driver, + flavor_profile.enabled, + flavor_profile.metainfo, + flavor_profile.description, + )) + + def setUp(self): + super(TestListFlavorProfile, self).setUp() + self.network.service_profiles = mock.Mock( + return_value=self._network_flavor_profiles) + + # Get the command object to test + self.cmd = network_flavor_profile.ListNetworkFlavorProfile( + self.app, self.namespace) + + def test_network_flavor_profile_list(self): + arglist = [] + verifylist = [] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.network.service_profiles.assert_called_once_with(**{}) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, list(data)) + + +class TestShowFlavorProfile(TestFlavorProfile): + + # The network flavor profile to show. + network_flavor_profile = ( + network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()) + columns = ( + 'description', + 'driver', + 'enabled', + 'id', + 'metainfo', + 'project_id', + ) + data = ( + network_flavor_profile.description, + network_flavor_profile.driver, + network_flavor_profile.enabled, + network_flavor_profile.id, + network_flavor_profile.metainfo, + network_flavor_profile.project_id, + ) + + def setUp(self): + super(TestShowFlavorProfile, self).setUp() + self.network.find_service_profile = mock.Mock( + return_value=self.network_flavor_profile) + + # Get the command object to test + self.cmd = network_flavor_profile.ShowNetworkFlavorProfile( + self.app, self.namespace) + + def test_show_all_options(self): + arglist = [ + self.network_flavor_profile.id, + ] + verifylist = [ + ('flavor_profile', self.network_flavor_profile.id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + self.network.find_service_profile.assert_called_once_with( + self.network_flavor_profile.id, ignore_missing=False) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) + + +class TestSetFlavorProfile(TestFlavorProfile): + + # The network flavor profile to set. + network_flavor_profile = ( + network_fakes.FakeNetworkFlavorProfile.create_one_service_profile()) + + def setUp(self): + super(TestSetFlavorProfile, self).setUp() + self.network.update_service_profile = mock.Mock(return_value=None) + self.network.find_service_profile = mock.Mock( + return_value=self.network_flavor_profile) + + # Get the command object to test + self.cmd = network_flavor_profile.SetNetworkFlavorProfile( + self.app, self.namespace) + + def test_set_nothing(self): + arglist = [self.network_flavor_profile.id] + verifylist = [ + ('flavor_profile', self.network_flavor_profile.id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + attrs = {} + self.network.update_service_profile.assert_called_with( + self.network_flavor_profile, **attrs) + self.assertIsNone(result) + + def test_set_enable(self): + arglist = [ + '--enable', + self.network_flavor_profile.id, + ] + verifylist = [ + ('enable', True), + ('flavor_profile', self.network_flavor_profile.id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + attrs = { + 'enabled': True, + } + self.network.update_service_profile.assert_called_with( + self.network_flavor_profile, **attrs) + self.assertIsNone(result) + + def test_set_disable(self): + arglist = [ + '--disable', + self.network_flavor_profile.id, + ] + verifylist = [ + ('disable', True), + ('flavor_profile', self.network_flavor_profile.id), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + attrs = { + 'enabled': False, + } + self.network.update_service_profile.assert_called_with( + self.network_flavor_profile, **attrs) + self.assertIsNone(result) diff --git a/openstackclient/tests/unit/volume/v2/fakes.py b/openstackclient/tests/unit/volume/v2/fakes.py index d54faec7..d321c71a 100644 --- a/openstackclient/tests/unit/volume/v2/fakes.py +++ b/openstackclient/tests/unit/volume/v2/fakes.py @@ -954,3 +954,53 @@ class FakeType(object): info=copy.deepcopy(encryption_info), loaded=True) return encryption_type + + +class FakeQuota(object): + """Fake quota""" + + @staticmethod + def create_one_vol_quota(attrs=None): + """Create one quota""" + attrs = attrs or {} + + quota_attrs = { + 'id': 'project-id-' + uuid.uuid4().hex, + 'backups': 100, + 'backup_gigabytes': 100, + 'gigabytes': 10, + 'per_volume_gigabytes': 10, + 'snapshots': 0, + 'volumes': 10} + + quota_attrs.update(attrs) + + quota = fakes.FakeResource( + info=copy.deepcopy(quota_attrs), + loaded=True) + quota.project_id = quota_attrs['id'] + + return quota + + @staticmethod + def create_one_default_vol_quota(attrs=None): + """Create one quota""" + attrs = attrs or {} + + quota_attrs = { + 'id': 'project-id-' + uuid.uuid4().hex, + 'backups': 100, + 'backup_gigabytes': 100, + 'gigabytes': 100, + 'per_volume_gigabytes': 100, + 'snapshots': 100, + 'volumes': 100} + + quota_attrs.update(attrs) + + quota = fakes.FakeResource( + info=copy.deepcopy(quota_attrs), + loaded=True) + quota.project_id = quota_attrs['id'] + + return quota |
