summaryrefslogtreecommitdiff
path: root/openstackclient
diff options
context:
space:
mode:
Diffstat (limited to 'openstackclient')
-rw-r--r--openstackclient/api/auth_plugin.py4
-rw-r--r--openstackclient/common/clientmanager.py76
-rw-r--r--openstackclient/compute/v2/agent.py36
-rw-r--r--openstackclient/network/common.py2
-rw-r--r--openstackclient/tests/compute/v2/fakes.py23
-rw-r--r--openstackclient/tests/compute/v2/test_agent.py73
-rw-r--r--openstackclient/tests/identity/v3/test_identity_provider.py6
-rw-r--r--openstackclient/tests/identity/v3/test_project.py17
-rw-r--r--openstackclient/tests/identity/v3/test_service_provider.py6
-rw-r--r--openstackclient/tests/network/v2/test_address_scope.py27
-rw-r--r--openstackclient/tests/network/v2/test_floating_ip.py4
-rw-r--r--openstackclient/tests/network/v2/test_ip_availability.py14
-rw-r--r--openstackclient/tests/network/v2/test_network.py50
-rw-r--r--openstackclient/tests/network/v2/test_security_group.py35
-rw-r--r--openstackclient/tests/network/v2/test_security_group_rule.py34
-rw-r--r--openstackclient/tests/network/v2/test_subnet.py21
-rw-r--r--openstackclient/tests/network/v2/test_subnet_pool.py25
-rw-r--r--openstackclient/tests/volume/test_find_resource.py13
-rw-r--r--openstackclient/tests/volume/v2/fakes.py20
-rw-r--r--openstackclient/tests/volume/v2/test_backup.py4
-rw-r--r--openstackclient/tests/volume/v2/test_qos_specs.py3
-rw-r--r--openstackclient/volume/v1/volume.py1
-rw-r--r--openstackclient/volume/v2/backup.py7
-rw-r--r--openstackclient/volume/v2/volume.py1
-rw-r--r--openstackclient/volume/v2/volume_type.py2
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"),