diff options
Diffstat (limited to 'openstackclient')
25 files changed, 304 insertions, 200 deletions
diff --git a/openstackclient/api/auth_plugin.py b/openstackclient/api/auth_plugin.py index dc47a688..a106b1eb 100644 --- a/openstackclient/api/auth_plugin.py +++ b/openstackclient/api/auth_plugin.py @@ -13,15 +13,11 @@ """Authentication Plugin Library""" -import logging - from keystoneauth1 import loading from keystoneauth1 import token_endpoint from openstackclient.i18n import _ -LOG = logging.getLogger(__name__) - class TokenEndpoint(loading.BaseLoader): """Auth plugin to handle traditional token/endpoint usage diff --git a/openstackclient/common/clientmanager.py b/openstackclient/common/clientmanager.py index 13c6b92c..ec005dc0 100644 --- a/openstackclient/common/clientmanager.py +++ b/openstackclient/common/clientmanager.py @@ -20,6 +20,7 @@ import logging import pkg_resources import sys +from keystoneauth1.loading import base from osc_lib.api import auth from osc_lib import exceptions from oslo_utils import strutils @@ -37,6 +38,77 @@ PLUGIN_MODULES = [] USER_AGENT = 'python-openstackclient' +# NOTE(dtroyer): Bringing back select_auth_plugin() and build_auth_params() +# temporarily because osc-lib 0.3.0 removed it a wee bit early +def select_auth_plugin(options): + """Pick an auth plugin based on --os-auth-type or other options""" + + auth_plugin_name = None + + # Do the token/url check first as this must override the default + # 'password' set by os-client-config + # Also, url and token are not copied into o-c-c's auth dict (yet?) + if options.auth.get('url') and options.auth.get('token'): + # service token authentication + auth_plugin_name = 'token_endpoint' + elif options.auth_type in auth.PLUGIN_LIST: + # A direct plugin name was given, use it + auth_plugin_name = options.auth_type + elif options.auth.get('username'): + if options.identity_api_version == '3': + auth_plugin_name = 'v3password' + elif options.identity_api_version.startswith('2'): + auth_plugin_name = 'v2password' + else: + # let keystoneauth figure it out itself + auth_plugin_name = 'password' + elif options.auth.get('token'): + if options.identity_api_version == '3': + auth_plugin_name = 'v3token' + elif options.identity_api_version.startswith('2'): + auth_plugin_name = 'v2token' + else: + # let keystoneauth figure it out itself + auth_plugin_name = 'token' + else: + # The ultimate default is similar to the original behaviour, + # but this time with version discovery + auth_plugin_name = 'password' + LOG.debug("Auth plugin %s selected", auth_plugin_name) + return auth_plugin_name + + +def build_auth_params(auth_plugin_name, cmd_options): + if auth_plugin_name: + LOG.debug('auth_type: %s', auth_plugin_name) + auth_plugin_loader = base.get_plugin_loader(auth_plugin_name) + auth_params = { + opt.dest: opt.default + for opt in base.get_plugin_options(auth_plugin_name) + } + auth_params.update(dict(cmd_options.auth)) + # grab tenant from project for v2.0 API compatibility + if auth_plugin_name.startswith("v2"): + if 'project_id' in auth_params: + auth_params['tenant_id'] = auth_params['project_id'] + del auth_params['project_id'] + if 'project_name' in auth_params: + auth_params['tenant_name'] = auth_params['project_name'] + del auth_params['project_name'] + else: + LOG.debug('no auth_type') + # delay the plugin choice, grab every option + auth_plugin_loader = None + auth_params = dict(cmd_options.auth) + plugin_options = set( + [o.replace('-', '_') for o in auth.get_options_list()] + ) + for option in plugin_options: + LOG.debug('fetching option %s', option) + auth_params[option] = getattr(cmd_options.auth, option, None) + return (auth_plugin_loader, auth_params) + + class ClientCache(object): """Descriptor class for caching created client handles.""" @@ -193,7 +265,7 @@ class ClientManager(object): # If no auth type is named by the user, select one based on # the supplied options - self.auth_plugin_name = auth.select_auth_plugin(self._cli_options) + self.auth_plugin_name = select_auth_plugin(self._cli_options) # Basic option checking to avoid unhelpful error messages auth.check_valid_authentication_options(self._cli_options, @@ -205,7 +277,7 @@ class ClientManager(object): not self._cli_options.auth.get('password')): self._cli_options.auth['password'] = self._pw_callback() - (auth_plugin, self._auth_params) = auth.build_auth_params( + (auth_plugin, self._auth_params) = build_auth_params( self.auth_plugin_name, self._cli_options, ) diff --git a/openstackclient/compute/v2/agent.py b/openstackclient/compute/v2/agent.py index 4d923955..76c1b3b7 100644 --- a/openstackclient/compute/v2/agent.py +++ b/openstackclient/compute/v2/agent.py @@ -152,28 +152,48 @@ class SetAgent(command.Command): help=_("ID of the agent") ) parser.add_argument( - "version", + "--agent-version", + dest="version", metavar="<version>", help=_("Version of the agent") ) parser.add_argument( - "url", + "--url", metavar="<url>", - help=_("URL") + help=_("URL of the agent") ) parser.add_argument( - "md5hash", + "--md5hash", metavar="<md5hash>", - help=_("MD5 hash") + help=_("MD5 hash of the agent") ) return parser def take_action(self, parsed_args): compute_client = self.app.client_manager.compute + data = compute_client.agents.list(hypervisor=None) + agent = {} + + for s in data: + if s.agent_id == int(parsed_args.id): + agent['version'] = s.version + agent['url'] = s.url + agent['md5hash'] = s.md5hash + if agent == {}: + msg = _("No agent with a ID of '%(id)s' exists.") + raise exceptions.CommandError(msg % parsed_args.id) + + if parsed_args.version: + agent['version'] = parsed_args.version + if parsed_args.url: + agent['url'] = parsed_args.url + if parsed_args.md5hash: + agent['md5hash'] = parsed_args.md5hash + args = ( parsed_args.id, - parsed_args.version, - parsed_args.url, - parsed_args.md5hash + agent['version'], + agent['url'], + agent['md5hash'], ) compute_client.agents.update(*args) diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py index f62840fc..2b1a5656 100644 --- a/openstackclient/network/common.py +++ b/openstackclient/network/common.py @@ -111,7 +111,7 @@ class NetworkAndComputeDelete(NetworkAndComputeCommand): if ret: total = len(resources) - msg = _("%(num)s of %(total)s %(resource)s failed to delete.") % { + msg = _("%(num)s of %(total)s %(resource)ss failed to delete.") % { "num": ret, "total": total, "resource": self.resource, diff --git a/openstackclient/tests/compute/v2/fakes.py b/openstackclient/tests/compute/v2/fakes.py index a62483d9..76402476 100644 --- a/openstackclient/tests/compute/v2/fakes.py +++ b/openstackclient/tests/compute/v2/fakes.py @@ -81,7 +81,10 @@ class FakeAggregate(object): "availability_zone": "ag_zone", } } + + # Overwrite default attributes. aggregate_info.update(attrs) + aggregate = fakes.FakeResource( info=copy.deepcopy(aggregate_info), loaded=True) @@ -254,6 +257,8 @@ class FakeAgent(object): 'md5hash': 'agent-md5hash', 'hypervisor': 'hypervisor', } + + # Overwrite default attributes. agent_info.update(attrs) agent = fakes.FakeResource(info=copy.deepcopy(agent_info), @@ -412,6 +417,8 @@ class FakeHypervisorStats(object): 'vcpus': 8, 'vcpus_used': 3, } + + # Overwrite default attributes. stats_info.update(attrs) # Set default method. @@ -575,7 +582,7 @@ class FakeServer(object): :param Dictionary methods: A dictionary with all methods :return: - A FakeResource object, with id, name, metadata + A FakeResource object, with id, name, metadata, and so on """ attrs = attrs or {} methods = methods or {} @@ -651,7 +658,7 @@ class FakeService(object): :param Dictionary attrs: A dictionary with all attributes :return: - A FakeResource object, with id, host, binary + A FakeResource object, with id, host, binary, and so on """ attrs = attrs or {} @@ -703,7 +710,7 @@ class FakeFlavor(object): :param Dictionary attrs: A dictionary with all attributes :return: - A FakeResource object, with id, name, ram, vcpus, properties + A FakeResource object, with id, name, ram, vcpus, and so on """ attrs = attrs or {} @@ -790,7 +797,7 @@ class FakeKeypair(object): :param Dictionary attrs: A dictionary with all attributes :return: - A FakeResource + A FakeResource object, name, fingerprint, and so on """ attrs = attrs or {} @@ -984,7 +991,7 @@ class FakeFloatingIPPool(object): :param Dictionary attrs: A dictionary with all attributes :return: - A FakeResource object, with id, etc + A FakeResource object, with name, etc """ if attrs is None: attrs = {} @@ -1127,7 +1134,7 @@ class FakeHost(object): :param Dictionary attrs: A dictionary with all attributes :return: - A FakeResource object, with id and other attributes + A FakeResource object, with uuid and other attributes """ attrs = attrs or {} @@ -1183,6 +1190,7 @@ class FakeServerGroup(object): if attrs is None: attrs = {} + # Set default attributes. server_group_info = { 'id': 'server-group-id-' + uuid.uuid4().hex, 'members': [], @@ -1192,7 +1200,10 @@ class FakeServerGroup(object): 'project_id': 'server-group-project-id-' + uuid.uuid4().hex, 'user_id': 'server-group-user-id-' + uuid.uuid4().hex, } + + # Overwrite default attributes. server_group_info.update(attrs) + server_group = fakes.FakeResource( info=copy.deepcopy(server_group_info), loaded=True) diff --git a/openstackclient/tests/compute/v2/test_agent.py b/openstackclient/tests/compute/v2/test_agent.py index da329728..7695ee41 100644 --- a/openstackclient/tests/compute/v2/test_agent.py +++ b/openstackclient/tests/compute/v2/test_agent.py @@ -25,7 +25,9 @@ from openstackclient.tests import utils as tests_utils class TestAgent(compute_fakes.TestComputev2): - fake_agent = compute_fakes.FakeAgent.create_one_agent() + attr = {} + attr['agent_id'] = 1 + fake_agent = compute_fakes.FakeAgent.create_one_agent(attr) columns = ( 'agent_id', @@ -238,21 +240,34 @@ class TestAgentSet(TestAgent): super(TestAgentSet, self).setUp() self.agents_mock.update.return_value = self.fake_agent + self.agents_mock.list.return_value = [self.fake_agent] self.cmd = agent.SetAgent(self.app, None) - def test_agent_set(self): + def test_agent_set_nothing(self): arglist = [ - 'id', - 'new-version', - 'new-url', - 'new-md5hash', + '1', + ] + verifylist = [ + ('id', '1'), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.agents_mock.update.assert_called_with(parsed_args.id, + self.fake_agent.version, + self.fake_agent.url, + self.fake_agent.md5hash) + self.assertIsNone(result) + + def test_agent_set_version(self): + arglist = [ + '1', + '--agent-version', 'new-version', ] verifylist = [ - ('id', 'id'), + ('id', '1'), ('version', 'new-version'), - ('url', 'new-url'), - ('md5hash', 'new-md5hash'), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -260,6 +275,46 @@ class TestAgentSet(TestAgent): self.agents_mock.update.assert_called_with(parsed_args.id, parsed_args.version, + self.fake_agent.url, + self.fake_agent.md5hash) + self.assertIsNone(result) + + def test_agent_set_url(self): + arglist = [ + '1', + '--url', 'new-url', + ] + + verifylist = [ + ('id', '1'), + ('url', 'new-url'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.agents_mock.update.assert_called_with(parsed_args.id, + self.fake_agent.version, parsed_args.url, + self.fake_agent.md5hash) + self.assertIsNone(result) + + def test_agent_set_md5hash(self): + arglist = [ + '1', + '--md5hash', 'new-md5hash', + ] + + verifylist = [ + ('id', '1'), + ('md5hash', 'new-md5hash'), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + result = self.cmd.take_action(parsed_args) + + self.agents_mock.update.assert_called_with(parsed_args.id, + self.fake_agent.version, + self.fake_agent.url, parsed_args.md5hash) self.assertIsNone(result) diff --git a/openstackclient/tests/identity/v3/test_identity_provider.py b/openstackclient/tests/identity/v3/test_identity_provider.py index aaf5b06d..161a1a1b 100644 --- a/openstackclient/tests/identity/v3/test_identity_provider.py +++ b/openstackclient/tests/identity/v3/test_identity_provider.py @@ -15,7 +15,6 @@ import copy import mock -import testtools from openstackclient.identity.v3 import identity_provider from openstackclient.tests import fakes @@ -600,11 +599,14 @@ class TestIdentityProviderShow(TestIdentityProvider): copy.deepcopy(identity_fakes.IDENTITY_PROVIDER), loaded=True, ) + + self.identity_providers_mock.get.side_effect = [Exception("Not found"), + ret] self.identity_providers_mock.get.return_value = ret + # Get the command object to test self.cmd = identity_provider.ShowIdentityProvider(self.app, None) - @testtools.skip("skip until bug 1599333 is fixed") def test_identity_provider_show(self): arglist = [ identity_fakes.idp_id, diff --git a/openstackclient/tests/identity/v3/test_project.py b/openstackclient/tests/identity/v3/test_project.py index 23b0c9a0..65874baa 100644 --- a/openstackclient/tests/identity/v3/test_project.py +++ b/openstackclient/tests/identity/v3/test_project.py @@ -16,7 +16,6 @@ import mock from osc_lib import exceptions -import testtools from openstackclient.identity.v3 import project from openstackclient.tests.identity.v3 import fakes as identity_fakes @@ -731,14 +730,16 @@ class TestProjectShow(TestProject): self.project = identity_fakes.FakeProject.create_one_project( attrs={'domain_id': self.domain.id}) - self.projects_mock.get.return_value = self.project # Get the command object to test self.cmd = project.ShowProject(self.app, None) - @testtools.skip("skip until bug 1599333 is fixed") def test_project_show(self): + self.projects_mock.get.side_effect = [Exception("Not found"), + self.project] + self.projects_mock.get.return_value = self.project + arglist = [ self.project.id, ] @@ -761,6 +762,7 @@ class TestProjectShow(TestProject): # returns a two-part tuple with a tuple of column names and a tuple of # data to be shown. columns, data = self.cmd.take_action(parsed_args) + self.projects_mock.get.assert_called_with( self.project.id, parents_as_list=False, @@ -788,7 +790,6 @@ class TestProjectShow(TestProject): ) self.assertEqual(datalist, data) - @testtools.skip("skip until bug 1599333 is fixed") def test_project_show_parents(self): self.project = identity_fakes.FakeProject.create_one_project( attrs={ @@ -796,6 +797,8 @@ class TestProjectShow(TestProject): 'parents': [{'project': {'id': self.project.parent_id}}] } ) + self.projects_mock.get.side_effect = [Exception("Not found"), + self.project] self.projects_mock.get.return_value = self.project arglist = [ @@ -848,7 +851,6 @@ class TestProjectShow(TestProject): ) self.assertEqual(data, datalist) - @testtools.skip("skip until bug 1599333 is fixed") def test_project_show_subtree(self): self.project = identity_fakes.FakeProject.create_one_project( attrs={ @@ -856,6 +858,8 @@ class TestProjectShow(TestProject): 'subtree': [{'project': {'id': 'children-id'}}] } ) + self.projects_mock.get.side_effect = [Exception("Not found"), + self.project] self.projects_mock.get.return_value = self.project arglist = [ @@ -908,7 +912,6 @@ class TestProjectShow(TestProject): ) self.assertEqual(data, datalist) - @testtools.skip("skip until bug 1599333 is fixed") def test_project_show_parents_and_children(self): self.project = identity_fakes.FakeProject.create_one_project( attrs={ @@ -917,6 +920,8 @@ class TestProjectShow(TestProject): 'subtree': [{'project': {'id': 'children-id'}}] } ) + self.projects_mock.get.side_effect = [Exception("Not found"), + self.project] self.projects_mock.get.return_value = self.project arglist = [ diff --git a/openstackclient/tests/identity/v3/test_service_provider.py b/openstackclient/tests/identity/v3/test_service_provider.py index 62ef5468..1d82cd15 100644 --- a/openstackclient/tests/identity/v3/test_service_provider.py +++ b/openstackclient/tests/identity/v3/test_service_provider.py @@ -14,8 +14,6 @@ import copy -import testtools - from openstackclient.identity.v3 import service_provider from openstackclient.tests import fakes from openstackclient.tests.identity.v3 import fakes as service_fakes @@ -393,11 +391,13 @@ class TestServiceProviderShow(TestServiceProvider): copy.deepcopy(service_fakes.SERVICE_PROVIDER), loaded=True, ) + self.service_providers_mock.get.side_effect = [Exception("Not found"), + ret] self.service_providers_mock.get.return_value = ret + # Get the command object to test self.cmd = service_provider.ShowServiceProvider(self.app, None) - @testtools.skip("skip until bug 1599333 is fixed") def test_service_provider_show(self): arglist = [ service_fakes.sp_id, diff --git a/openstackclient/tests/network/v2/test_address_scope.py b/openstackclient/tests/network/v2/test_address_scope.py index 722371f9..16e74f46 100644 --- a/openstackclient/tests/network/v2/test_address_scope.py +++ b/openstackclient/tests/network/v2/test_address_scope.py @@ -11,7 +11,6 @@ # under the License. # -import copy import mock from mock import call @@ -35,11 +34,13 @@ class TestAddressScope(network_fakes.TestNetworkV2): class TestCreateAddressScope(TestAddressScope): + project = identity_fakes_v3.FakeProject.create_one_project() + domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new address scope created. new_address_scope = ( network_fakes.FakeAddressScope.create_one_address_scope( attrs={ - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': project.id, } )) columns = ( @@ -75,19 +76,11 @@ class TestCreateAddressScope(TestAddressScope): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # Get a shortcut to the DomainManager Mock self.domains_mock = self.identity.domains - self.domains_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.DOMAIN), - loaded=True, - ) + self.domains_mock.get.return_value = self.domain def test_create_no_options(self): arglist = [] @@ -121,15 +114,15 @@ class TestCreateAddressScope(TestAddressScope): arglist = [ '--ip-version', str(self.new_address_scope.ip_version), '--share', - '--project', identity_fakes_v3.project_name, - '--project-domain', identity_fakes_v3.domain_name, + '--project', self.project.name, + '--project-domain', self.domain.name, self.new_address_scope.name, ] verifylist = [ ('ip_version', self.new_address_scope.ip_version), ('share', True), - ('project', identity_fakes_v3.project_name), - ('project_domain', identity_fakes_v3.domain_name), + ('project', self.project.name), + ('project_domain', self.domain.name), ('name', self.new_address_scope.name), ] @@ -139,7 +132,7 @@ class TestCreateAddressScope(TestAddressScope): self.network.create_address_scope.assert_called_once_with(**{ 'ip_version': self.new_address_scope.ip_version, 'shared': True, - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': self.project.id, 'name': self.new_address_scope.name, }) self.assertEqual(self.columns, columns) diff --git a/openstackclient/tests/network/v2/test_floating_ip.py b/openstackclient/tests/network/v2/test_floating_ip.py index 5cd5279a..234fe446 100644 --- a/openstackclient/tests/network/v2/test_floating_ip.py +++ b/openstackclient/tests/network/v2/test_floating_ip.py @@ -211,7 +211,7 @@ class TestDeleteFloatingIPNetwork(TestFloatingIPNetwork): self.cmd.take_action(parsed_args) self.fail('CommandError should be raised.') except exceptions.CommandError as e: - self.assertEqual('1 of 2 floating_ip failed to delete.', str(e)) + self.assertEqual('1 of 2 floating_ips failed to delete.', str(e)) self.network.find_ip.assert_any_call( self.floating_ips[0].id, ignore_missing=False) @@ -462,7 +462,7 @@ class TestDeleteFloatingIPCompute(TestFloatingIPCompute): self.cmd.take_action(parsed_args) self.fail('CommandError should be raised.') except exceptions.CommandError as e: - self.assertEqual('1 of 2 floating_ip failed to delete.', str(e)) + self.assertEqual('1 of 2 floating_ips failed to delete.', str(e)) self.compute.floating_ips.get.assert_any_call( self.floating_ips[0].id) diff --git a/openstackclient/tests/network/v2/test_ip_availability.py b/openstackclient/tests/network/v2/test_ip_availability.py index c6ec2b0b..21d44d07 100644 --- a/openstackclient/tests/network/v2/test_ip_availability.py +++ b/openstackclient/tests/network/v2/test_ip_availability.py @@ -11,7 +11,6 @@ # under the License. # -import copy import mock from osc_lib import utils as common_utils @@ -41,11 +40,8 @@ class TestIPAvailability(network_fakes.TestNetworkV2): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes.PROJECT), - loaded=True, - ) + self.project = identity_fakes.FakeProject.create_one_project() + self.projects_mock.get.return_value = self.project class TestListIPAvailability(TestIPAvailability): @@ -109,16 +105,16 @@ class TestListIPAvailability(TestIPAvailability): def test_list_project(self): arglist = [ - '--project', identity_fakes.project_name + '--project', self.project.name ] verifylist = [ - ('project', identity_fakes.project_name) + ('project', self.project.name) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - filters = {'tenant_id': identity_fakes.project_id, + filters = {'tenant_id': self.project.id, 'ip_version': 4} self.network.network_ip_availabilities.assert_called_once_with( diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py index 8fc9dadf..4322bf9a 100644 --- a/openstackclient/tests/network/v2/test_network.py +++ b/openstackclient/tests/network/v2/test_network.py @@ -11,7 +11,6 @@ # under the License. # -import copy import mock from mock import call @@ -40,10 +39,12 @@ class TestNetwork(network_fakes.TestNetworkV2): class TestCreateNetworkIdentityV3(TestNetwork): + project = identity_fakes_v3.FakeProject.create_one_project() + domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new network created. _network = network_fakes.FakeNetwork.create_one_network( attrs={ - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': project.id, 'availability_zone_hints': ["nova"], } ) @@ -96,19 +97,11 @@ class TestCreateNetworkIdentityV3(TestNetwork): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # Get a shortcut to the DomainManager Mock self.domains_mock = self.identity.domains - self.domains_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.DOMAIN), - loaded=True, - ) + self.domains_mock.get.return_value = self.domain def test_create_no_options(self): arglist = [] @@ -143,8 +136,8 @@ class TestCreateNetworkIdentityV3(TestNetwork): arglist = [ "--disable", "--share", - "--project", identity_fakes_v3.project_name, - "--project-domain", identity_fakes_v3.domain_name, + "--project", self.project.name, + "--project-domain", self.domain.name, "--availability-zone-hint", "nova", "--external", "--default", "--provider-network-type", "vlan", @@ -156,8 +149,8 @@ class TestCreateNetworkIdentityV3(TestNetwork): verifylist = [ ('disable', True), ('share', True), - ('project', identity_fakes_v3.project_name), - ('project_domain', identity_fakes_v3.domain_name), + ('project', self.project.name), + ('project_domain', self.domain.name), ('availability_zone_hints', ["nova"]), ('external', True), ('default', True), @@ -176,7 +169,7 @@ class TestCreateNetworkIdentityV3(TestNetwork): 'availability_zone_hints': ["nova"], 'name': self._network.name, 'shared': True, - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': self.project.id, 'is_default': True, 'router:external': True, 'provider:network_type': 'vlan', @@ -214,9 +207,10 @@ class TestCreateNetworkIdentityV3(TestNetwork): class TestCreateNetworkIdentityV2(TestNetwork): + project = identity_fakes_v2.FakeProject.create_one_project() # The new network created. _network = network_fakes.FakeNetwork.create_one_network( - attrs={'tenant_id': identity_fakes_v2.project_id} + attrs={'tenant_id': project.id} ) columns = ( @@ -267,24 +261,20 @@ class TestCreateNetworkIdentityV2(TestNetwork): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.tenants - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v2.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # There is no DomainManager Mock in fake identity v2. def test_create_with_project_identityv2(self): arglist = [ - "--project", identity_fakes_v2.project_name, + "--project", self.project.name, self._network.name, ] verifylist = [ ('enable', True), ('share', None), ('name', self._network.name), - ('project', identity_fakes_v2.project_name), + ('project', self.project.name), ('external', False), ] @@ -294,22 +284,22 @@ class TestCreateNetworkIdentityV2(TestNetwork): self.network.create_network.assert_called_once_with(**{ 'admin_state_up': True, 'name': self._network.name, - 'tenant_id': identity_fakes_v2.project_id, + 'tenant_id': self.project.id, }) self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) def test_create_with_domain_identityv2(self): arglist = [ - "--project", identity_fakes_v3.project_name, - "--project-domain", identity_fakes_v3.domain_name, + "--project", self.project.name, + "--project-domain", "domain-name", self._network.name, ] verifylist = [ ('enable', True), ('share', None), - ('project', identity_fakes_v3.project_name), - ('project_domain', identity_fakes_v3.domain_name), + ('project', self.project.name), + ('project_domain', "domain-name"), ('name', self._network.name), ('external', False), ] diff --git a/openstackclient/tests/network/v2/test_security_group.py b/openstackclient/tests/network/v2/test_security_group.py index b0c14985..cea64897 100644 --- a/openstackclient/tests/network/v2/test_security_group.py +++ b/openstackclient/tests/network/v2/test_security_group.py @@ -11,7 +11,6 @@ # under the License. # -import copy import mock from mock import call @@ -45,6 +44,8 @@ class TestSecurityGroupCompute(compute_fakes.TestComputev2): class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork): + project = identity_fakes.FakeProject.create_one_project() + domain = identity_fakes.FakeDomain.create_one_domain() # The security group to be created. _security_group = \ network_fakes.FakeSecurityGroup.create_one_security_group() @@ -81,19 +82,11 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # Get a shortcut to the DomainManager Mock self.domains_mock = self.identity.domains - self.domains_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes.DOMAIN), - loaded=True, - ) + self.domains_mock.get.return_value = self.domain # Get the command object to test self.cmd = security_group.CreateSecurityGroup(self.app, self.namespace) @@ -123,15 +116,15 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork): def test_create_all_options(self): arglist = [ '--description', self._security_group.description, - '--project', identity_fakes.project_name, - '--project-domain', identity_fakes.domain_name, + '--project', self.project.name, + '--project-domain', self.domain.name, self._security_group.name, ] verifylist = [ ('description', self._security_group.description), ('name', self._security_group.name), - ('project', identity_fakes.project_name), - ('project_domain', identity_fakes.domain_name), + ('project', self.project.name), + ('project_domain', self.domain.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -140,7 +133,7 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork): self.network.create_security_group.assert_called_once_with(**{ 'description': self._security_group.description, 'name': self._security_group.name, - 'tenant_id': identity_fakes.project_id, + 'tenant_id': self.project.id, }) self.assertEqual(self.columns, columns) self.assertEqual(self.data, data) @@ -148,6 +141,8 @@ class TestCreateSecurityGroupNetwork(TestSecurityGroupNetwork): class TestCreateSecurityGroupCompute(TestSecurityGroupCompute): + project = identity_fakes.FakeProject.create_one_project() + domain = identity_fakes.FakeDomain.create_one_domain() # The security group to be shown. _security_group = \ compute_fakes.FakeSecurityGroup.create_one_security_group() @@ -184,8 +179,8 @@ class TestCreateSecurityGroupCompute(TestSecurityGroupCompute): def test_create_network_options(self): arglist = [ - '--project', identity_fakes.project_name, - '--project-domain', identity_fakes.domain_name, + '--project', self.project.name, + '--project-domain', self.domain.name, self._security_group.name, ] self.assertRaises(tests_utils.ParserException, @@ -301,7 +296,7 @@ class TestDeleteSecurityGroupNetwork(TestSecurityGroupNetwork): self.cmd.take_action(parsed_args) self.fail('CommandError should be raised.') except exceptions.CommandError as e: - self.assertEqual('1 of 2 group failed to delete.', str(e)) + self.assertEqual('1 of 2 groups failed to delete.', str(e)) self.network.find_security_group.assert_any_call( self._security_groups[0].name, ignore_missing=False) @@ -389,7 +384,7 @@ class TestDeleteSecurityGroupCompute(TestSecurityGroupCompute): self.cmd.take_action(parsed_args) self.fail('CommandError should be raised.') except exceptions.CommandError as e: - self.assertEqual('1 of 2 group failed to delete.', str(e)) + self.assertEqual('1 of 2 groups failed to delete.', str(e)) self.compute.security_groups.get.assert_any_call( self._security_groups[0].id) diff --git a/openstackclient/tests/network/v2/test_security_group_rule.py b/openstackclient/tests/network/v2/test_security_group_rule.py index b2862679..34d35629 100644 --- a/openstackclient/tests/network/v2/test_security_group_rule.py +++ b/openstackclient/tests/network/v2/test_security_group_rule.py @@ -46,6 +46,8 @@ class TestSecurityGroupRuleCompute(compute_fakes.TestComputev2): class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): + project = identity_fakes.FakeProject.create_one_project() + domain = identity_fakes.FakeDomain.create_one_domain() # The security group rule to be created. _security_group_rule = None @@ -103,19 +105,11 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # Get a shortcut to the DomainManager Mock self.domains_mock = self.identity.domains - self.domains_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes.DOMAIN), - loaded=True, - ) + self.domains_mock.get.return_value = self.domain # Get the command object to test self.cmd = security_group_rule.CreateSecurityGroupRule( @@ -306,8 +300,8 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): '--dst-port', str(self._security_group_rule.port_range_min), '--egress', '--ethertype', self._security_group_rule.ethertype, - '--project', identity_fakes.project_name, - '--project-domain', identity_fakes.domain_name, + '--project', self.project.name, + '--project-domain', self.domain.name, '--protocol', self._security_group_rule.protocol, self._security_group.id, ] @@ -316,8 +310,8 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): self._security_group_rule.port_range_max)), ('egress', True), ('ethertype', self._security_group_rule.ethertype), - ('project', identity_fakes.project_name), - ('project_domain', identity_fakes.domain_name), + ('project', self.project.name), + ('project_domain', self.domain.name), ('protocol', self._security_group_rule.protocol), ('group', self._security_group.id), ] @@ -332,7 +326,7 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): 'port_range_min': self._security_group_rule.port_range_min, 'protocol': self._security_group_rule.protocol, 'security_group_id': self._security_group.id, - 'tenant_id': identity_fakes.project_id, + 'tenant_id': self.project.id, }) self.assertEqual(self.expected_columns, columns) self.assertEqual(self.expected_data, data) @@ -470,6 +464,8 @@ class TestCreateSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute): + project = identity_fakes.FakeProject.create_one_project() + domain = identity_fakes.FakeDomain.create_one_domain() # The security group rule to be created. _security_group_rule = None @@ -534,8 +530,8 @@ class TestCreateSecurityGroupRuleCompute(TestSecurityGroupRuleCompute): '--ethertype', 'IPv4', '--icmp-type', '3', '--icmp-code', '11', - '--project', identity_fakes.project_name, - '--project-domain', identity_fakes.domain_name, + '--project', self.project.name, + '--project-domain', self.domain.name, self._security_group.id, ] self.assertRaises(tests_utils.ParserException, @@ -743,7 +739,7 @@ class TestDeleteSecurityGroupRuleNetwork(TestSecurityGroupRuleNetwork): self.cmd.take_action(parsed_args) self.fail('CommandError should be raised.') except exceptions.CommandError as e: - self.assertEqual('1 of 2 rule failed to delete.', str(e)) + self.assertEqual('1 of 2 rules failed to delete.', str(e)) self.network.find_security_group_rule.assert_any_call( self._security_group_rules[0].id, ignore_missing=False) @@ -823,7 +819,7 @@ class TestDeleteSecurityGroupRuleCompute(TestSecurityGroupRuleCompute): self.cmd.take_action(parsed_args) self.fail('CommandError should be raised.') except exceptions.CommandError as e: - self.assertEqual('1 of 2 rule failed to delete.', str(e)) + self.assertEqual('1 of 2 rules failed to delete.', str(e)) self.compute.security_group_rules.delete.assert_any_call( self._security_group_rules[0].id) diff --git a/openstackclient/tests/network/v2/test_subnet.py b/openstackclient/tests/network/v2/test_subnet.py index 82813d6c..46af44fb 100644 --- a/openstackclient/tests/network/v2/test_subnet.py +++ b/openstackclient/tests/network/v2/test_subnet.py @@ -11,7 +11,6 @@ # under the License. # -import copy import mock from mock import call @@ -36,10 +35,12 @@ class TestSubnet(network_fakes.TestNetworkV2): class TestCreateSubnet(TestSubnet): + project = identity_fakes_v3.FakeProject.create_one_project() + domain = identity_fakes_v3.FakeDomain.create_one_domain() # An IPv4 subnet to be created with mostly default values _subnet = network_fakes.FakeSubnet.create_one_subnet( attrs={ - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': project.id, } ) @@ -49,7 +50,7 @@ class TestCreateSubnet(TestSubnet): # An IPv4 subnet to be created using a specific subnet pool _subnet_from_pool = network_fakes.FakeSubnet.create_one_subnet( attrs={ - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': project.id, 'subnetpool_id': _subnet_pool.id, 'dns_nameservers': ['8.8.8.8', '8.8.4.4'], @@ -63,7 +64,7 @@ class TestCreateSubnet(TestSubnet): # An IPv6 subnet to be created with most options specified _subnet_ipv6 = network_fakes.FakeSubnet.create_one_subnet( attrs={ - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': project.id, 'cidr': 'fe80:0:0:a00a::/64', 'enable_dhcp': True, 'dns_nameservers': ['fe80:27ff:a00a:f00f::ffff', @@ -187,19 +188,11 @@ class TestCreateSubnet(TestSubnet): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # Get a shortcut to the DomainManager Mock self.domains_mock = self.identity.domains - self.domains_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.DOMAIN), - loaded=True, - ) + self.domains_mock.get.return_value = self.domain # Mock SDK calls for all tests. self.network.find_network = mock.Mock(return_value=self._network) diff --git a/openstackclient/tests/network/v2/test_subnet_pool.py b/openstackclient/tests/network/v2/test_subnet_pool.py index 41b6170f..8269af0b 100644 --- a/openstackclient/tests/network/v2/test_subnet_pool.py +++ b/openstackclient/tests/network/v2/test_subnet_pool.py @@ -12,7 +12,6 @@ # import argparse -import copy import mock from mock import call @@ -37,6 +36,8 @@ class TestSubnetPool(network_fakes.TestNetworkV2): class TestCreateSubnetPool(TestSubnetPool): + project = identity_fakes_v3.FakeProject.create_one_project() + domain = identity_fakes_v3.FakeDomain.create_one_domain() # The new subnet pool to create. _subnet_pool = network_fakes.FakeSubnetPool.create_one_subnet_pool() @@ -93,19 +94,11 @@ class TestCreateSubnetPool(TestSubnetPool): # Get a shortcut to the ProjectManager Mock self.projects_mock = self.identity.projects - self.projects_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.PROJECT), - loaded=True, - ) + self.projects_mock.get.return_value = self.project # Get a shortcut to the DomainManager Mock self.domains_mock = self.identity.domains - self.domains_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(identity_fakes_v3.DOMAIN), - loaded=True, - ) + self.domains_mock.get.return_value = self.domain def test_create_no_options(self): arglist = [] @@ -191,14 +184,14 @@ class TestCreateSubnetPool(TestSubnetPool): def test_create_project_domain(self): arglist = [ '--pool-prefix', '10.0.10.0/24', - "--project", identity_fakes_v3.project_name, - "--project-domain", identity_fakes_v3.domain_name, + "--project", self.project.name, + "--project-domain", self.domain.name, self._subnet_pool.name, ] verifylist = [ ('prefixes', ['10.0.10.0/24']), - ('project', identity_fakes_v3.project_name), - ('project_domain', identity_fakes_v3.domain_name), + ('project', self.project.name), + ('project_domain', self.domain.name), ('name', self._subnet_pool.name), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -207,7 +200,7 @@ class TestCreateSubnetPool(TestSubnetPool): self.network.create_subnet_pool.assert_called_once_with(**{ 'prefixes': ['10.0.10.0/24'], - 'tenant_id': identity_fakes_v3.project_id, + 'tenant_id': self.project.id, 'name': self._subnet_pool.name, }) self.assertEqual(self.columns, columns) diff --git a/openstackclient/tests/volume/test_find_resource.py b/openstackclient/tests/volume/test_find_resource.py index 8f29ec34..982b02f0 100644 --- a/openstackclient/tests/volume/test_find_resource.py +++ b/openstackclient/tests/volume/test_find_resource.py @@ -19,7 +19,6 @@ from cinderclient.v1 import volume_snapshots from cinderclient.v1 import volumes from osc_lib import exceptions from osc_lib import utils -import testtools from openstackclient.tests import utils as test_utils from openstackclient.volume import client # noqa @@ -45,16 +44,16 @@ class TestFindResourceVolumes(test_utils.TestCase): api.client.get = mock.Mock() resp = mock.Mock() body = {"volumes": [{"id": ID, 'display_name': NAME}]} - api.client.get.side_effect = [Exception("Not found"), (resp, body)] + api.client.get.side_effect = [Exception("Not found"), + Exception("Not found"), + (resp, body)] self.manager = volumes.VolumeManager(api) - @testtools.skip("skip until bug 1599333 is fixed") def test_find(self): result = utils.find_resource(self.manager, NAME) self.assertEqual(ID, result.id) self.assertEqual(NAME, result.display_name) - @testtools.skip("skip until bug 1599333 is fixed") def test_not_find(self): self.assertRaises(exceptions.CommandError, utils.find_resource, self.manager, 'GeorgeMartin') @@ -69,16 +68,16 @@ class TestFindResourceVolumeSnapshots(test_utils.TestCase): api.client.get = mock.Mock() resp = mock.Mock() body = {"snapshots": [{"id": ID, 'display_name': NAME}]} - api.client.get.side_effect = [Exception("Not found"), (resp, body)] + api.client.get.side_effect = [Exception("Not found"), + Exception("Not found"), + (resp, body)] self.manager = volume_snapshots.SnapshotManager(api) - @testtools.skip("skip until bug 1599333 is fixed") def test_find(self): result = utils.find_resource(self.manager, NAME) self.assertEqual(ID, result.id) self.assertEqual(NAME, result.display_name) - @testtools.skip("skip until bug 1599333 is fixed") def test_not_find(self): self.assertRaises(exceptions.CommandError, utils.find_resource, self.manager, 'GeorgeMartin') diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py index eff0faf9..8a628ac9 100644 --- a/openstackclient/tests/volume/v2/fakes.py +++ b/openstackclient/tests/volume/v2/fakes.py @@ -146,26 +146,6 @@ class FakeService(object): return services - @staticmethod - def get_services(services=None, count=2): - """Get an iterable MagicMock object with a list of faked services. - - If services list is provided, then initialize the Mock object with the - list. Otherwise create one. - - :param List services: - A list of FakeResource objects faking services - :param Integer count: - The number of services to be faked - :return - An iterable Mock object with side_effect set to a list of faked - services - """ - if services is None: - services = FakeService.create_services(count) - - return mock.MagicMock(side_effect=services) - class FakeVolumeClient(object): diff --git a/openstackclient/tests/volume/v2/test_backup.py b/openstackclient/tests/volume/v2/test_backup.py index ce26a2d6..31bfa64c 100644 --- a/openstackclient/tests/volume/v2/test_backup.py +++ b/openstackclient/tests/volume/v2/test_backup.py @@ -79,6 +79,7 @@ class TestBackupCreate(TestBackup): "--description", self.new_backup.description, "--container", self.new_backup.container, "--force", + "--incremental", "--snapshot", self.new_backup.snapshot_id, self.new_backup.volume_id, ] @@ -87,6 +88,7 @@ class TestBackupCreate(TestBackup): ("description", self.new_backup.description), ("container", self.new_backup.container), ("force", True), + ("incremental", True), ("snapshot", self.new_backup.snapshot_id), ("volume", self.new_backup.volume_id), ] @@ -100,6 +102,7 @@ class TestBackupCreate(TestBackup): name=self.new_backup.name, description=self.new_backup.description, force=True, + incremental=True, snapshot_id=self.new_backup.snapshot_id, ) self.assertEqual(self.columns, columns) @@ -126,6 +129,7 @@ class TestBackupCreate(TestBackup): name=None, description=self.new_backup.description, force=False, + incremental=False, snapshot_id=None, ) self.assertEqual(self.columns, columns) diff --git a/openstackclient/tests/volume/v2/test_qos_specs.py b/openstackclient/tests/volume/v2/test_qos_specs.py index 92ffca74..da0e8ba5 100644 --- a/openstackclient/tests/volume/v2/test_qos_specs.py +++ b/openstackclient/tests/volume/v2/test_qos_specs.py @@ -13,9 +13,10 @@ # under the License. # +from osc_lib import utils + from openstackclient.tests.volume.v2 import fakes as volume_fakes from openstackclient.volume.v2 import qos_specs -from osc_lib import utils class TestQos(volume_fakes.TestVolume): diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py index e11aa1a7..820673bb 100644 --- a/openstackclient/volume/v1/volume.py +++ b/openstackclient/volume/v1/volume.py @@ -175,7 +175,6 @@ class DeleteVolume(command.Command): ) parser.add_argument( '--force', - dest='force', action='store_true', default=False, help=_('Attempt forced removal of volume(s), regardless of state ' diff --git a/openstackclient/volume/v2/backup.py b/openstackclient/volume/v2/backup.py index fed5f09e..49226bcc 100644 --- a/openstackclient/volume/v2/backup.py +++ b/openstackclient/volume/v2/backup.py @@ -59,6 +59,12 @@ class CreateBackup(command.ShowOne): default=False, help=_("Allow to back up an in-use volume") ) + parser.add_argument( + '--incremental', + action='store_true', + default=False, + help=_("Perform an incremental backup") + ) return parser def take_action(self, parsed_args): @@ -75,6 +81,7 @@ class CreateBackup(command.ShowOne): name=parsed_args.name, description=parsed_args.description, force=parsed_args.force, + incremental=parsed_args.incremental, snapshot_id=snapshot_id, ) backup._info.pop("links", None) diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index be2388fb..0ee7bd8f 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -167,7 +167,6 @@ class DeleteVolume(command.Command): ) parser.add_argument( "--force", - dest="force", action="store_true", default=False, help=_("Attempt forced removal of volume(s), regardless of state " diff --git a/openstackclient/volume/v2/volume_type.py b/openstackclient/volume/v2/volume_type.py index 87f4c547..91ac17a1 100644 --- a/openstackclient/volume/v2/volume_type.py +++ b/openstackclient/volume/v2/volume_type.py @@ -47,14 +47,12 @@ class CreateVolumeType(command.ShowOne): public_group = parser.add_mutually_exclusive_group() public_group.add_argument( "--public", - dest="public", action="store_true", default=False, help=_("Volume type is accessible to the public"), ) public_group.add_argument( "--private", - dest="private", action="store_true", default=False, help=_("Volume type is not accessible to the public"), |
