summaryrefslogtreecommitdiff
diff options
authorCorey Bryant <corey.bryant@canonical.com>2018-11-05 08:38:38 -0500
committergit-ubuntu importer <ubuntu-devel-discuss@lists.ubuntu.com>2018-11-06 21:03:55 +0000
commit88a532b32e9d11904b774e62a9a3fa57fef61504 (patch)
tree3c31d7b654e741d4a15ace4b5e2a99ebd19872d8
parent92fca0b819014f64faf2d08811b3fed9a9a4cd08 (diff)
Imported using git-ubuntu import.
Notes
Notes: * d/gbp.conf: Create stable/queens branch. * New stable point release for OpenStack Queens (LP: #1800490).
-rw-r--r--.zuul.yaml10
-rw-r--r--AUTHORS2
-rw-r--r--ChangeLog17
-rw-r--r--PKG-INFO3
-rw-r--r--debian/changelog7
-rw-r--r--debian/gbp.conf2
-rw-r--r--doc/source/cli/command-objects/network.rst12
-rw-r--r--openstackclient/__init__.py4
-rw-r--r--openstackclient/api/compute_v2.py156
-rw-r--r--openstackclient/common/extension.py6
-rw-r--r--openstackclient/compute/v2/host.py18
-rw-r--r--openstackclient/compute/v2/server.py59
-rw-r--r--openstackclient/identity/v3/role.py8
-rw-r--r--openstackclient/image/v1/image.py10
-rw-r--r--openstackclient/network/common.py5
-rw-r--r--openstackclient/network/v2/network.py14
-rw-r--r--openstackclient/network/v2/router.py4
-rw-r--r--openstackclient/tests/functional/common/test_extension.py9
-rw-r--r--openstackclient/tests/functional/network/v2/test_network.py70
-rw-r--r--openstackclient/tests/functional/network/v2/test_network_agent.py45
-rw-r--r--openstackclient/tests/functional/network/v2/test_network_flavor.py6
-rw-r--r--openstackclient/tests/functional/network/v2/test_network_qos_rule.py154
-rw-r--r--openstackclient/tests/functional/network/v2/test_port.py90
-rw-r--r--openstackclient/tests/functional/object/v1/test_object.py32
-rw-r--r--openstackclient/tests/functional/volume/v1/test_volume_type.py26
-rw-r--r--openstackclient/tests/functional/volume/v2/test_volume_type.py32
-rw-r--r--openstackclient/tests/unit/api/test_compute_v2.py176
-rw-r--r--openstackclient/tests/unit/compute/v2/fakes.py5
-rw-r--r--openstackclient/tests/unit/compute/v2/test_host.py85
-rw-r--r--openstackclient/tests/unit/compute/v2/test_server.py224
-rw-r--r--openstackclient/tests/unit/network/v2/fakes.py1
-rw-r--r--openstackclient/tests/unit/network/v2/test_network.py9
-rw-r--r--python_openstackclient.egg-info/PKG-INFO3
-rw-r--r--python_openstackclient.egg-info/SOURCES.txt1
-rw-r--r--python_openstackclient.egg-info/pbr.json2
-rw-r--r--releasenotes/notes/neutron_mtu-d87e53e2d76f8612.yaml5
-rw-r--r--test-requirements.txt4
-rw-r--r--tox.ini6
38 files changed, 940 insertions, 382 deletions
diff --git a/.zuul.yaml b/.zuul.yaml
index 98446e6..eed8d20 100644
--- a/.zuul.yaml
+++ b/.zuul.yaml
@@ -11,7 +11,7 @@
- openstack/os-client-config
- openstack/osc-lib
- openstack/python-openstackclient
- - openstack/python-openstacksdk
+ - openstack/openstacksdk
vars:
tox_envlist: py27
# Set work dir to openstackclient so that if it's triggered by one of the
@@ -33,7 +33,7 @@
- openstack/os-client-config
- openstack/osc-lib
- openstack/python-openstackclient
- - openstack/python-openstacksdk
+ - openstack/openstacksdk
vars:
# Set work dir to openstackclient so that if it's triggered by one of the
# other repos the tests will run in the same place
@@ -54,7 +54,7 @@
- openstack/os-client-config
- openstack/osc-lib
- openstack/python-openstackclient
- - openstack/python-openstacksdk
+ - openstack/openstacksdk
vars:
# Set work dir to openstackclient so that if it's triggered by one of the
# other repos the tests will run in the same place
@@ -158,11 +158,11 @@
- openstack/os-client-config
- openstack/osc-lib
- openstack/python-openstackclient
- - openstack/python-openstacksdk
+ - openstack/openstacksdk
vars:
devstack_localrc:
USE_PYTHON3: true
- LIBS_FROM_GIT: python-openstackclient,python-openstacksdk,osc-lib,os-client-config
+ LIBS_FROM_GIT: python-openstackclient,openstacksdk,osc-lib,os-client-config
# This is insufficient, but leaving it here as a reminder of what may
# someday be all we need to make this work
# disable_python3_package swift
diff --git a/AUTHORS b/AUTHORS
index b454361..d93d1be 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -78,6 +78,7 @@ Doug Hellmann <doug@doughellmann.com>
Dougal Matthews <dougal@redhat.com>
Einst Crazy <yu.changcai@99cloud.net>
Elena Ezhova <eezhova@mirantis.com>
+Emilien Macchi <emilien@redhat.com>
Eric Brown <browne@vmware.com>
Fang Zhen <zhen.fang@easystack.cn>
Fei Long Wang <flwang@catalyst.net.nz>
@@ -233,6 +234,7 @@ Samuel de Medeiros Queiroz <samueldmq@gmail.com>
Sascha Peilicke <saschpe@gmx.de>
Sascha Peilicke <speilicke@suse.com>
Sean Dague <sean@dague.net>
+Sean McGinnis <sean.mcginnis@gmail.com>
Sean Perry <sean.perry@hp.com>
Sean Perry <sean.perry@hpe.com>
Shane Wang <shane.wang@intel.com>
diff --git a/ChangeLog b/ChangeLog
index a8c3942..e4031e1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,23 @@
CHANGES
=======
+3.14.2
+------
+
+* Re-implement novaclient bits removed in 10.0
+* Clean up W503 and E402 pep8 errors
+
+3.14.1
+------
+
+* neutron: add --mtu for create/set network
+* Rename python-openstacksdk to openstacksdk
+* Handle SDK changes
+* Updated from global requirements
+* Updated from global requirements
+* Update UPPER\_CONSTRAINTS\_FILE for stable/queens
+* Update .gitreview for stable/queens
+
3.14.0
------
diff --git a/PKG-INFO b/PKG-INFO
index 896b10e..dc6f734 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,11 @@
Metadata-Version: 1.1
Name: python-openstackclient
-Version: 3.14.0
+Version: 3.14.2
Summary: OpenStack Command-line Client
Home-page: https://docs.openstack.org/python-openstackclient/latest/
Author: OpenStack
Author-email: openstack-dev@lists.openstack.org
License: UNKNOWN
-Description-Content-Type: UNKNOWN
Description: ========================
Team and repository tags
========================
diff --git a/debian/changelog b/debian/changelog
index 009ce51..6da72e2 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+python-openstackclient (3.14.2-0ubuntu1) bionic; urgency=medium
+
+ * d/gbp.conf: Create stable/queens branch.
+ * New stable point release for OpenStack Queens (LP: #1800490).
+
+ -- Corey Bryant <corey.bryant@canonical.com> Mon, 05 Nov 2018 08:38:38 -0500
+
python-openstackclient (3.14.0-0ubuntu1) bionic; urgency=medium
* New upstream release.
diff --git a/debian/gbp.conf b/debian/gbp.conf
index 24f9139..daee790 100644
--- a/debian/gbp.conf
+++ b/debian/gbp.conf
@@ -1,5 +1,5 @@
[DEFAULT]
-debian-branch = master
+debian-branch = stable/queens
upstream-tag = %(version)s
pristine-tar = True
diff --git a/doc/source/cli/command-objects/network.rst b/doc/source/cli/command-objects/network.rst
index 5f20dc3..220fbf3 100644
--- a/doc/source/cli/command-objects/network.rst
+++ b/doc/source/cli/command-objects/network.rst
@@ -24,6 +24,7 @@ Create new network
[--enable | --disable]
[--share | --no-share]
[--description <description>]
+ [--mtu <mtu>]
[--availability-zone-hint <availability-zone>]
[--enable-port-security | --disable-port-security]
[--external [--default | --no-default] | --internal]
@@ -74,6 +75,12 @@ Create new network
*Network version 2 only*
+.. option:: --mtu <mtu>
+
+ Set network mtu
+
+ *Network version 2 only*
+
.. option:: --availability-zone-hint <availability-zone>
Availability Zone in which to create this network
@@ -353,6 +360,7 @@ Set network properties
[--enable | --disable]
[--share | --no-share]
[--description <description>]
+ [--mtu <mtu>]
[--enable-port-security | --disable-port-security]
[--external [--default | --no-default] | --internal]
[--provider-network-type <provider-network-type>]
@@ -386,6 +394,10 @@ Set network properties
Set network description
+.. option:: --mtu <mtu>
+
+ Set network mtu
+
.. option:: --enable-port-security
Enable port security by default for ports created on
diff --git a/openstackclient/__init__.py b/openstackclient/__init__.py
index 89deee3..e6e7f7c 100644
--- a/openstackclient/__init__.py
+++ b/openstackclient/__init__.py
@@ -11,10 +11,10 @@
# under the License.
#
-__all__ = ['__version__']
-
import pbr.version
+__all__ = ['__version__']
+
version_info = pbr.version.VersionInfo('python-openstackclient')
try:
__version__ = version_info.version_string()
diff --git a/openstackclient/api/compute_v2.py b/openstackclient/api/compute_v2.py
index 0ffed65..0c89e91 100644
--- a/openstackclient/api/compute_v2.py
+++ b/openstackclient/api/compute_v2.py
@@ -93,7 +93,51 @@ class APIv2(api.BaseAPI):
return ret
- # Flaoting IPs
+ # Floating IPs
+
+ def floating_ip_add(
+ self,
+ server,
+ address,
+ fixed_address=None,
+ ):
+ """Add a floating IP to a server
+
+ :param server:
+ The :class:`Server` (or its ID) to add an IP to.
+ :param address:
+ The FloatingIP or string floating address to add.
+ :param fixed_address:
+ The FixedIP the floatingIP should be associated with (optional)
+ """
+
+ url = '/servers'
+
+ server = self.find(
+ url,
+ attr='name',
+ value=server,
+ )
+
+ address = address.ip if hasattr(address, 'ip') else address
+ if fixed_address:
+ if hasattr(fixed_address, 'ip'):
+ fixed_address = fixed_address.ip
+
+ body = {
+ 'address': address,
+ 'fixed_address': fixed_address,
+ }
+ else:
+ body = {
+ 'address': address,
+ }
+
+ return self._request(
+ "POST",
+ "/%s/%s/action" % (url, server['id']),
+ json={'addFloatingIp': body},
+ )
def floating_ip_create(
self,
@@ -175,6 +219,38 @@ class APIv2(api.BaseAPI):
return self.list(url)["floating_ips"]
+ def floating_ip_remove(
+ self,
+ server,
+ address,
+ ):
+ """Remove a floating IP from a server
+
+ :param server:
+ The :class:`Server` (or its ID) to add an IP to.
+ :param address:
+ The FloatingIP or string floating address to add.
+ """
+
+ url = '/servers'
+
+ server = self.find(
+ url,
+ attr='name',
+ value=server,
+ )
+
+ address = address.ip if hasattr(address, 'ip') else address
+ body = {
+ 'address': address,
+ }
+
+ return self._request(
+ "POST",
+ "/%s/%s/action" % (url, server['id']),
+ json={'removeFloatingIp': body},
+ )
+
# Floating IP Pools
def floating_ip_pool_list(
@@ -192,6 +268,84 @@ class APIv2(api.BaseAPI):
return self.list(url)["floating_ip_pools"]
+ # Hosts
+
+ def host_list(
+ self,
+ zone=None,
+ ):
+ """Lists hypervisor Hosts
+
+ https://developer.openstack.org/api-ref/compute/#list-hosts
+ Valid for Compute 2.0 - 2.42
+
+ :param string zone:
+ Availability zone
+ :returns: A dict of the floating IP attributes
+ """
+
+ url = "/os-hosts"
+ if zone:
+ url = '/os-hosts?zone=%s' % zone
+
+ return self.list(url)["hosts"]
+
+ def host_set(
+ self,
+ host=None,
+ status=None,
+ maintenance_mode=None,
+ **params
+ ):
+ """Modify host properties
+
+ https://developer.openstack.org/api-ref/compute/#update-host-status
+ Valid for Compute 2.0 - 2.42
+
+ status
+ maintenance_mode
+ """
+
+ url = "/os-hosts"
+
+ params = {}
+ if status:
+ params['status'] = status
+ if maintenance_mode:
+ params['maintenance_mode'] = maintenance_mode
+ if params == {}:
+ # Don't bother calling if nothing given
+ return None
+ else:
+ return self._request(
+ "PUT",
+ "/%s/%s" % (url, host),
+ json=params,
+ ).json()
+
+ def host_show(
+ self,
+ host=None,
+ ):
+ """Show host
+
+ https://developer.openstack.org/api-ref/compute/#show-host-details
+ Valid for Compute 2.0 - 2.42
+ """
+
+ url = "/os-hosts"
+
+ r_host = self.find(
+ url,
+ attr='host_name',
+ value=host,
+ )
+
+ data = []
+ for h in r_host:
+ data.append(h['resource'])
+ return data
+
# Networks
def network_create(
diff --git a/openstackclient/common/extension.py b/openstackclient/common/extension.py
index 139f43a..7120661 100644
--- a/openstackclient/common/extension.py
+++ b/openstackclient/common/extension.py
@@ -75,8 +75,10 @@ class ListExtension(command.Lister):
# by default we want to show everything, unless the
# user specifies one or more of the APIs to show
# for now, only identity and compute are supported.
- show_all = (not parsed_args.identity and not parsed_args.compute
- and not parsed_args.volume and not parsed_args.network)
+ show_all = (not parsed_args.identity and
+ not parsed_args.compute and
+ not parsed_args.volume and
+ not parsed_args.network)
if parsed_args.identity or show_all:
identity_client = self.app.client_manager.identity
diff --git a/openstackclient/compute/v2/host.py b/openstackclient/compute/v2/host.py
index a495b36..9fdfd92 100644
--- a/openstackclient/compute/v2/host.py
+++ b/openstackclient/compute/v2/host.py
@@ -40,9 +40,9 @@ class ListHost(command.Lister):
"Service",
"Zone"
)
- data = compute_client.hosts.list_all(parsed_args.zone)
+ data = compute_client.api.host_list(parsed_args.zone)
return (columns,
- (utils.get_item_properties(
+ (utils.get_dict_properties(
s, columns,
) for s in data))
@@ -95,13 +95,7 @@ class SetHost(command.Command):
compute_client = self.app.client_manager.compute
- # More than one hosts will be returned by using find_resource()
- # so that the return value cannot be used in host update() method.
- # find_resource() is just used for checking existence of host and
- # keeping the exception message consistent with other commands.
- utils.find_resource(compute_client.hosts, parsed_args.host)
-
- compute_client.hosts.update(
+ compute_client.api.host_set(
parsed_args.host,
kwargs
)
@@ -128,8 +122,10 @@ class ShowHost(command.Lister):
"Memory MB",
"Disk GB"
)
- data = compute_client.hosts.get(parsed_args.host)
+
+ data = compute_client.api.host_show(parsed_args.host)
+
return (columns,
- (utils.get_item_properties(
+ (utils.get_dict_properties(
s, columns,
) for s in data))
diff --git a/openstackclient/compute/v2/server.py b/openstackclient/compute/v2/server.py
index c08f5ca..85c20ae 100644
--- a/openstackclient/compute/v2/server.py
+++ b/openstackclient/compute/v2/server.py
@@ -32,6 +32,7 @@ import six
from openstackclient.i18n import _
from openstackclient.identity import common as identity_common
+from openstackclient.network import common as network_common
LOG = logging.getLogger(__name__)
@@ -234,11 +235,10 @@ class AddFixedIP(command.Command):
)
-class AddFloatingIP(command.Command):
+class AddFloatingIP(network_common.NetworkAndComputeCommand):
_description = _("Add floating IP address to server")
- def get_parser(self, prog_name):
- parser = super(AddFloatingIP, self).get_parser(prog_name)
+ def update_parser_common(self, parser):
parser.add_argument(
"server",
metavar="<server>",
@@ -252,19 +252,37 @@ class AddFloatingIP(command.Command):
parser.add_argument(
"--fixed-ip-address",
metavar="<ip-address>",
- help=_("Fixed IP address to associate with this floating IP "
- "address"),
+ help=_(
+ "Fixed IP address to associate with this floating IP address"
+ ),
)
return parser
- def take_action(self, parsed_args):
+ def take_action_network(self, client, parsed_args):
compute_client = self.app.client_manager.compute
+ attrs = {}
+ obj = client.find_ip(
+ parsed_args.ip_address,
+ ignore_missing=False,
+ )
server = utils.find_resource(
- compute_client.servers, parsed_args.server)
+ compute_client.servers,
+ parsed_args.server,
+ )
+ port = list(client.ports(device_id=server.id))[0]
+ attrs['port_id'] = port.id
+ if parsed_args.fixed_ip_address:
+ attrs['fixed_ip_address'] = parsed_args.fixed_ip_address
+
+ client.update_ip(obj, **attrs)
- server.add_floating_ip(parsed_args.ip_address,
- parsed_args.fixed_ip_address)
+ def take_action_compute(self, client, parsed_args):
+ client.api.floating_ip_add(
+ parsed_args.server,
+ parsed_args.ip_address,
+ fixed_address=parsed_args.fixed_ip_address,
+ )
class AddPort(command.Command):
@@ -1482,11 +1500,10 @@ class RemoveFixedIP(command.Command):
server.remove_fixed_ip(parsed_args.ip_address)
-class RemoveFloatingIP(command.Command):
+class RemoveFloatingIP(network_common.NetworkAndComputeCommand):
_description = _("Remove floating IP address from server")
- def get_parser(self, prog_name):
- parser = super(RemoveFloatingIP, self).get_parser(prog_name)
+ def update_parser_common(self, parser):
parser.add_argument(
"server",
metavar="<server>",
@@ -1501,13 +1518,21 @@ class RemoveFloatingIP(command.Command):
)
return parser
- def take_action(self, parsed_args):
- compute_client = self.app.client_manager.compute
+ def take_action_network(self, client, parsed_args):
+ attrs = {}
+ obj = client.find_ip(
+ parsed_args.ip_address,
+ ignore_missing=False,
+ )
+ attrs['port_id'] = None
- server = utils.find_resource(
- compute_client.servers, parsed_args.server)
+ client.update_ip(obj, **attrs)
- server.remove_floating_ip(parsed_args.ip_address)
+ def take_action_compute(self, client, parsed_args):
+ client.api.floating_ip_remove(
+ parsed_args.server,
+ parsed_args.ip_address,
+ )
class RemovePort(command.Command):
diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py
index 1bbf5f0..2828a34 100644
--- a/openstackclient/identity/v3/role.py
+++ b/openstackclient/identity/v3/role.py
@@ -126,8 +126,8 @@ class AddRole(command.Command):
def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity
- if (not parsed_args.user and not parsed_args.domain
- and not parsed_args.group and not parsed_args.project):
+ if (not parsed_args.user and not parsed_args.domain and
+ not parsed_args.group and not parsed_args.project):
msg = _("Role not added, incorrect set of arguments "
"provided. See openstack --help for more details")
raise exceptions.CommandError(msg)
@@ -399,8 +399,8 @@ class RemoveRole(command.Command):
def take_action(self, parsed_args):
identity_client = self.app.client_manager.identity
- if (not parsed_args.user and not parsed_args.domain
- and not parsed_args.group and not parsed_args.project):
+ if (not parsed_args.user and not parsed_args.domain and
+ not parsed_args.group and not parsed_args.project):
msg = _("Incorrect set of arguments provided. "
"See openstack --help for more details")
raise exceptions.CommandError(msg)
diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py
index 7a8e67b..7ecaa3e 100644
--- a/openstackclient/image/v1/image.py
+++ b/openstackclient/image/v1/image.py
@@ -21,11 +21,6 @@ import logging
import os
import sys
-if os.name == "nt":
- import msvcrt
-else:
- msvcrt = None
-
from glanceclient.common import utils as gc_utils
from osc_lib.cli import parseractions
from osc_lib.command import command
@@ -35,6 +30,11 @@ import six
from openstackclient.api import utils as api_utils
from openstackclient.i18n import _
+if os.name == "nt":
+ import msvcrt
+else:
+ msvcrt = None
+
CONTAINER_CHOICES = ["ami", "ari", "aki", "bare", "docker", "ova", "ovf"]
DEFAULT_CONTAINER_FORMAT = 'bare'
diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py
index eca0de3..37bf140 100644
--- a/openstackclient/network/common.py
+++ b/openstackclient/network/common.py
@@ -48,7 +48,10 @@ class NetworkAndComputeCommand(command.Command):
parser = super(NetworkAndComputeCommand, self).get_parser(prog_name)
parser = self.update_parser_common(parser)
LOG.debug('common parser: %s', parser)
- if self.app.client_manager.is_network_endpoint_enabled():
+ if (
+ self.app is None or
+ self.app.client_manager.is_network_endpoint_enabled()
+ ):
return self.update_parser_network(parser)
else:
return self.update_parser_compute(parser)
diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py
index 4c1725c..d1c7f00 100644
--- a/openstackclient/network/v2/network.py
+++ b/openstackclient/network/v2/network.py
@@ -107,6 +107,10 @@ def _get_attrs_network(client_manager, parsed_args):
if parsed_args.description:
attrs['description'] = parsed_args.description
+ # set mtu
+ if parsed_args.mtu:
+ attrs['mtu'] = parsed_args.mtu
+
# update_external_network_options
if parsed_args.internal:
attrs['router:external'] = False
@@ -217,6 +221,11 @@ class CreateNetwork(common.NetworkAndComputeShowOne):
metavar='<description>',
help=_("Set network description")
)
+ parser.add_argument(
+ '--mtu',
+ metavar='<mtu>',
+ help=_("Set network mtu")
+ )
identity_common.add_project_domain_option_to_parser(parser)
parser.add_argument(
'--availability-zone-hint',
@@ -619,6 +628,11 @@ class SetNetwork(command.Command):
metavar="<description",
help=_("Set network description")
)
+ parser.add_argument(
+ '--mtu',
+ metavar="<mtu",
+ help=_("Set network mtu")
+ )
port_security_group = parser.add_mutually_exclusive_group()
port_security_group.add_argument(
'--enable-port-security',
diff --git a/openstackclient/network/v2/router.py b/openstackclient/network/v2/router.py
index caf3236..f0a5196 100644
--- a/openstackclient/network/v2/router.py
+++ b/openstackclient/network/v2/router.py
@@ -86,8 +86,8 @@ def _get_attrs(client_manager, parsed_args):
attrs['distributed'] = False
if parsed_args.distributed:
attrs['distributed'] = True
- if ('availability_zone_hints' in parsed_args
- and parsed_args.availability_zone_hints is not None):
+ if ('availability_zone_hints' in parsed_args and
+ parsed_args.availability_zone_hints is not None):
attrs['availability_zone_hints'] = parsed_args.availability_zone_hints
if parsed_args.description is not None:
attrs['description'] = parsed_args.description
diff --git a/openstackclient/tests/functional/common/test_extension.py b/openstackclient/tests/functional/common/test_extension.py
index e3a91fe..3391406 100644
--- a/openstackclient/tests/functional/common/test_extension.py
+++ b/openstackclient/tests/functional/common/test_extension.py
@@ -105,7 +105,14 @@ class ExtensionTests(base.TestCase):
try:
self.openstack('extension show ' + name)
except tempest_exc.CommandFailed as e:
- self.assertIn('ResourceNotFound', str(e))
+ # NOTE(dtroyer): We have to test for both strings because the
+ # change in the SDK between 0.9.19 and 0.11.x
+ # spans our allowed range in stable/queens.
+ not_found = (
+ 'ResourceNotFound' in str(e) or
+ 'No Extension found for' in str(e)
+ )
+ self.assertTrue(not_found)
self.assertIn(name, str(e))
else:
self.fail('CommandFailed should be raised')
diff --git a/openstackclient/tests/functional/network/v2/test_network.py b/openstackclient/tests/functional/network/v2/test_network.py
index 40fb382..9cef135 100644
--- a/openstackclient/tests/functional/network/v2/test_network.py
+++ b/openstackclient/tests/functional/network/v2/test_network.py
@@ -209,7 +209,7 @@ class NetworkTests(common.NetworkTagTests):
cmd_output["description"],
)
- del_output = self.openstack('network delete ' + name1 + ' ' + name2)
+ del_output = self.openstack('network delete %s %s' % (name1, name2))
self.assertOutput('', del_output)
def test_network_list(self):
@@ -224,7 +224,7 @@ class NetworkTests(common.NetworkTagTests):
network_options +
name1
))
- self.addCleanup(self.openstack, 'network delete ' + name1)
+ self.addCleanup(self.openstack, 'network delete %s' % name1)
self.assertIsNotNone(cmd_output["id"])
if self.haz_network:
self.assertEqual(
@@ -264,10 +264,8 @@ class NetworkTests(common.NetworkTagTests):
else:
network_options = '--subnet 4.5.6.7/28 '
cmd_output = json.loads(self.openstack(
- 'network create -f json ' +
- '--share ' +
- network_options +
- name2
+ 'network create -f json --share %s%s' %
+ (network_options, name2)
))
self.addCleanup(self.openstack, 'network delete ' + name2)
self.assertIsNotNone(cmd_output["id"])
@@ -313,8 +311,7 @@ class NetworkTests(common.NetworkTagTests):
# Test list --long
if self.haz_network:
cmd_output = json.loads(self.openstack(
- "network list -f json " +
- "--long"
+ "network list -f json --long"
))
col_name = [x["Name"] for x in cmd_output]
self.assertIn(name1, col_name)
@@ -323,9 +320,7 @@ class NetworkTests(common.NetworkTagTests):
# Test list --long --enable
if self.haz_network:
cmd_output = json.loads(self.openstack(
- "network list -f json " +
- "--enable " +
- "--long"
+ "network list -f json --enable --long"
))
col_name = [x["Name"] for x in cmd_output]
self.assertIn(name1, col_name)
@@ -334,9 +329,7 @@ class NetworkTests(common.NetworkTagTests):
# Test list --long --disable
if self.haz_network:
cmd_output = json.loads(self.openstack(
- "network list -f json " +
- "--disable " +
- "--long"
+ "network list -f json --disable --long"
))
col_name = [x["Name"] for x in cmd_output]
self.assertNotIn(name1, col_name)
@@ -345,8 +338,7 @@ class NetworkTests(common.NetworkTagTests):
# Test list --share
if self.haz_network:
cmd_output = json.loads(self.openstack(
- "network list -f json " +
- "--share "
+ "network list -f json --share "
))
col_name = [x["Name"] for x in cmd_output]
self.assertNotIn(name1, col_name)
@@ -355,8 +347,7 @@ class NetworkTests(common.NetworkTagTests):
# Test list --no-share
if self.haz_network:
cmd_output = json.loads(self.openstack(
- "network list -f json " +
- "--no-share "
+ "network list -f json --no-share "
))
col_name = [x["Name"] for x in cmd_output]
self.assertIn(name1, col_name)
@@ -368,12 +359,10 @@ class NetworkTests(common.NetworkTagTests):
name1 = uuid.uuid4().hex
cmd_output1 = json.loads(self.openstack(
- 'network create -f json ' +
- '--description aaaa ' +
- name1
+ 'network create -f json --description aaaa %s' % name1
))
- self.addCleanup(self.openstack, 'network delete ' + name1)
+ self.addCleanup(self.openstack, 'network delete %s' % name1)
# Get network ID
network_id = cmd_output1['id']
@@ -386,20 +375,19 @@ class NetworkTests(common.NetworkTagTests):
# Add Agent to Network
self.openstack(
- 'network agent add network --dhcp '
- + agent_id + ' ' + network_id
+ 'network agent add network --dhcp %s %s' % (agent_id, network_id)
)
# Test network list --agent
cmd_output3 = json.loads(self.openstack(
- 'network list -f json --agent ' + agent_id
+ 'network list -f json --agent %s' % agent_id
))
# Cleanup
# Remove Agent from Network
self.openstack(
- 'network agent remove network --dhcp '
- + agent_id + ' ' + network_id
+ 'network agent remove network --dhcp %s %s' %
+ (agent_id, network_id)
)
# Assert
@@ -415,16 +403,16 @@ class NetworkTests(common.NetworkTagTests):
name = uuid.uuid4().hex
cmd_output = json.loads(self.openstack(
- 'network create -f json ' +
- '--description aaaa ' +
- '--enable ' +
- '--no-share ' +
- '--internal ' +
- '--no-default ' +
- '--enable-port-security ' +
+ 'network create -f json '
+ '--description aaaa '
+ '--enable '
+ '--no-share '
+ '--internal '
+ '--no-default '
+ '--enable-port-security %s' %
name
))
- self.addCleanup(self.openstack, 'network delete ' + name)
+ self.addCleanup(self.openstack, 'network delete %s' % name)
self.assertIsNotNone(cmd_output["id"])
self.assertEqual(
'aaaa',
@@ -453,12 +441,12 @@ class NetworkTests(common.NetworkTagTests):
)
raw_output = self.openstack(
- 'network set ' +
- '--description cccc ' +
- '--disable ' +
- '--share ' +
- '--external ' +
- '--disable-port-security ' +
+ 'network set '
+ '--description cccc '
+ '--disable '
+ '--share '
+ '--external '
+ '--disable-port-security %s' %
name
)
self.assertOutput('', raw_output)
diff --git a/openstackclient/tests/functional/network/v2/test_network_agent.py b/openstackclient/tests/functional/network/v2/test_network_agent.py
index 0c74ea1..86769e0 100644
--- a/openstackclient/tests/functional/network/v2/test_network_agent.py
+++ b/openstackclient/tests/functional/network/v2/test_network_agent.py
@@ -42,8 +42,7 @@ class NetworkAgentTests(common.NetworkTests):
# agent show
cmd_output = json.loads(self.openstack(
- 'network agent show -f json ' +
- agent_ids[0]
+ 'network agent show -f json %s' % agent_ids[0]
))
self.assertEqual(
agent_ids[0],
@@ -52,15 +51,12 @@ class NetworkAgentTests(common.NetworkTests):
# agent set
raw_output = self.openstack(
- 'network agent set ' +
- '--disable ' +
- agent_ids[0]
+ 'network agent set --disable %s' % agent_ids[0]
)
self.assertOutput('', raw_output)
cmd_output = json.loads(self.openstack(
- 'network agent show -f json ' +
- agent_ids[0]
+ 'network agent show -f json %s' % agent_ids[0]
))
self.assertEqual(
"DOWN",
@@ -68,15 +64,12 @@ class NetworkAgentTests(common.NetworkTests):
)
raw_output = self.openstack(
- 'network agent set ' +
- '--enable ' +
- agent_ids[0]
+ 'network agent set --enable %s' % agent_ids[0]
)
self.assertOutput('', raw_output)
cmd_output = json.loads(self.openstack(
- 'network agent show -f json ' +
- agent_ids[0]
+ 'network agent show -f json %s' % agent_ids[0]
))
self.assertEqual(
"UP",
@@ -98,12 +91,10 @@ class NetworkAgentListTests(common.NetworkTests):
name1 = uuid.uuid4().hex
cmd_output1 = json.loads(self.openstack(
- 'network create -f json ' +
- '--description aaaa ' +
- name1
+ 'network create -f json --description aaaa %s' % name1
))
- self.addCleanup(self.openstack, 'network delete ' + name1)
+ self.addCleanup(self.openstack, 'network delete %s' % name1)
# Get network ID
network_id = cmd_output1['id']
@@ -116,20 +107,20 @@ class NetworkAgentListTests(common.NetworkTests):
# Add Agent to Network
self.openstack(
- 'network agent add network --dhcp '
- + agent_id + ' ' + network_id
+ 'network agent add network --dhcp %s %s' %
+ (agent_id, network_id)
)
# Test network agent list --network
cmd_output3 = json.loads(self.openstack(
- 'network agent list -f json --network ' + network_id
+ 'network agent list -f json --network %s' % network_id
))
# Cleanup
# Remove Agent from Network
self.openstack(
- 'network agent remove network --dhcp '
- + agent_id + ' ' + network_id
+ 'network agent remove network --dhcp %s %s' %
+ (agent_id, network_id)
)
# Assert
@@ -142,9 +133,9 @@ class NetworkAgentListTests(common.NetworkTests):
"""Add agent to router, list agents on router, delete."""
name = uuid.uuid4().hex
cmd_output = json.loads(self.openstack(
- 'router create -f json ' + name))
+ 'router create -f json %s' % name))
- self.addCleanup(self.openstack, 'router delete ' + name)
+ self.addCleanup(self.openstack, 'router delete %s' % name)
# Get router ID
router_id = cmd_output['id']
# Get l3 agent id
@@ -157,19 +148,19 @@ class NetworkAgentListTests(common.NetworkTests):
# Add router to agent
self.openstack(
- 'network agent add router --l3 ' + agent_id + ' ' + router_id)
+ 'network agent add router --l3 %s %s' % (agent_id, router_id))
# Test router list --agent
cmd_output = json.loads(self.openstack(
- 'network agent list -f json --router ' + router_id))
+ 'network agent list -f json --router %s' % router_id))
agent_ids = [x['ID'] for x in cmd_output]
self.assertIn(agent_id, agent_ids)
# Remove router from agent
self.openstack(
- 'network agent remove router --l3 ' + agent_id + ' ' + router_id)
+ 'network agent remove router --l3 %s %s' % (agent_id, router_id))
cmd_output = json.loads(self.openstack(
- 'network agent list -f json --router ' + router_id))
+ 'network agent list -f json --router %s' % router_id))
agent_ids = [x['ID'] for x in cmd_output]
self.assertNotIn(agent_id, agent_ids)
diff --git a/openstackclient/tests/functional/network/v2/test_network_flavor.py b/openstackclient/tests/functional/network/v2/test_network_flavor.py
index 47e7b44..ba3de2c 100644
--- a/openstackclient/tests/functional/network/v2/test_network_flavor.py
+++ b/openstackclient/tests/functional/network/v2/test_network_flavor.py
@@ -39,13 +39,13 @@ class NetworkFlavorTests(common.NetworkTests):
# Create Service Flavor
cmd_output2 = json.loads(self.openstack(
'network flavor profile create -f json --description '
- + 'fakedescription' + ' --enable --metainfo ' + 'Extrainfo'
+ 'fakedescription --enable --metainfo Extrainfo'
))
service_profile_id = cmd_output2.get('id')
- self.addCleanup(self.openstack, 'network flavor delete ' +
+ self.addCleanup(self.openstack, 'network flavor delete %s' %
flavor_id)
- self.addCleanup(self.openstack, 'network flavor profile delete ' +
+ self.addCleanup(self.openstack, 'network flavor profile delete %s' %
service_profile_id)
# Add flavor to service profile
self.openstack(
diff --git a/openstackclient/tests/functional/network/v2/test_network_qos_rule.py b/openstackclient/tests/functional/network/v2/test_network_qos_rule.py
index 770abe9..5d23540 100644
--- a/openstackclient/tests/functional/network/v2/test_network_qos_rule.py
+++ b/openstackclient/tests/functional/network/v2/test_network_qos_rule.py
@@ -28,62 +28,60 @@ class NetworkQosRuleTestsMinimumBandwidth(common.NetworkTests):
if not self.haz_network:
self.skipTest("No Network service present")
- self.QOS_POLICY_NAME = 'qos_policy_' + uuid.uuid4().hex
+ self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
- 'network qos policy create ' +
- self.QOS_POLICY_NAME
+ 'network qos policy create %s' % self.QOS_POLICY_NAME
)
self.addCleanup(self.openstack,
- 'network qos policy delete ' + self.QOS_POLICY_NAME)
+ 'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = json.loads(self.openstack(
- 'network qos rule create -f json ' +
- '--type minimum-bandwidth ' +
- '--min-kbps 2800 ' +
- '--egress ' +
+ 'network qos rule create -f json '
+ '--type minimum-bandwidth '
+ '--min-kbps 2800 '
+ '--egress %s' %
self.QOS_POLICY_NAME
))
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
- 'network qos rule delete ' +
- self.QOS_POLICY_NAME + ' ' +
- self.RULE_ID)
+ 'network qos rule delete %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID))
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
- self.openstack('network qos policy create -f json ' + policy_name)
+ self.openstack('network qos policy create -f json %s' % policy_name)
self.addCleanup(self.openstack,
- 'network qos policy delete ' + policy_name)
+ 'network qos policy delete %s' % policy_name)
rule = json.loads(self.openstack(
- 'network qos rule create -f json ' +
- '--type minimum-bandwidth ' +
- '--min-kbps 2800 ' +
- '--egress ' + policy_name
+ 'network qos rule create -f json '
+ '--type minimum-bandwidth '
+ '--min-kbps 2800 '
+ '--egress %s' % policy_name
))
raw_output = self.openstack(
- 'network qos rule delete ' +
- policy_name + ' ' + rule['id'])
+ 'network qos rule delete %s %s' %
+ (policy_name, rule['id']))
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = json.loads(self.openstack(
- 'network qos rule list -f json ' + self.QOS_POLICY_NAME))
+ 'network qos rule list -f json %s' % self.QOS_POLICY_NAME))
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = json.loads(self.openstack(
- 'network qos rule show -f json ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID))
+ 'network qos rule show -f json %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID)))
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
- self.openstack('network qos rule set --min-kbps 7500 ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID)
+ self.openstack('network qos rule set --min-kbps 7500 %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID))
cmd_output = json.loads(self.openstack(
- 'network qos rule show -f json ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID))
+ 'network qos rule show -f json %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID)))
self.assertEqual(7500, cmd_output['min_kbps'])
@@ -96,58 +94,57 @@ class NetworkQosRuleTestsDSCPMarking(common.NetworkTests):
if not self.haz_network:
self.skipTest("No Network service present")
- self.QOS_POLICY_NAME = 'qos_policy_' + uuid.uuid4().hex
+ self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
- 'network qos policy create ' +
- self.QOS_POLICY_NAME
+ 'network qos policy create %s' % self.QOS_POLICY_NAME
)
self.addCleanup(self.openstack,
- 'network qos policy delete ' + self.QOS_POLICY_NAME)
+ 'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = json.loads(self.openstack(
- 'network qos rule create -f json ' +
- '--type dscp-marking ' +
- '--dscp-mark 8 ' +
+ 'network qos rule create -f json '
+ '--type dscp-marking '
+ '--dscp-mark 8 %s' %
self.QOS_POLICY_NAME
))
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
- 'network qos rule delete ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID)
+ 'network qos rule delete %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID))
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
- self.openstack('network qos policy create -f json ' + policy_name)
+ self.openstack('network qos policy create -f json %s' % policy_name)
self.addCleanup(self.openstack,
- 'network qos policy delete ' + policy_name)
+ 'network qos policy delete %s' % policy_name)
rule = json.loads(self.openstack(
- 'network qos rule create -f json ' +
- '--type dscp-marking ' +
- '--dscp-mark 8 ' + policy_name
+ 'network qos rule create -f json '
+ '--type dscp-marking '
+ '--dscp-mark 8 %s' % policy_name
))
raw_output = self.openstack(
- 'network qos rule delete ' +
- policy_name + ' ' + rule['id'])
+ 'network qos rule delete %s %s' %
+ (policy_name, rule['id']))
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = json.loads(self.openstack(
- 'network qos rule list -f json ' + self.QOS_POLICY_NAME))
+ 'network qos rule list -f json %s' % self.QOS_POLICY_NAME))
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = json.loads(self.openstack(
- 'network qos rule show -f json ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID))
+ 'network qos rule show -f json %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID)))
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
- self.openstack('network qos rule set --dscp-mark 32 ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID)
+ self.openstack('network qos rule set --dscp-mark 32 %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID))
cmd_output = json.loads(self.openstack(
- 'network qos rule show -f json ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID))
+ 'network qos rule show -f json %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID)))
self.assertEqual(32, cmd_output['dscp_mark'])
@@ -160,65 +157,64 @@ class NetworkQosRuleTestsBandwidthLimit(common.NetworkTests):
if not self.haz_network:
self.skipTest("No Network service present")
- self.QOS_POLICY_NAME = 'qos_policy_' + uuid.uuid4().hex
+ self.QOS_POLICY_NAME = 'qos_policy_%s' % uuid.uuid4().hex
self.openstack(
- 'network qos policy create ' +
- self.QOS_POLICY_NAME
+ 'network qos policy create %s' % self.QOS_POLICY_NAME
)
self.addCleanup(self.openstack,
- 'network qos policy delete ' + self.QOS_POLICY_NAME)
+ 'network qos policy delete %s' % self.QOS_POLICY_NAME)
cmd_output = json.loads(self.openstack(
- 'network qos rule create -f json ' +
- '--type bandwidth-limit ' +
- '--max-kbps 10000 ' +
- '--max-burst-kbits 1400 ' +
- '--egress ' +
+ 'network qos rule create -f json '
+ '--type bandwidth-limit '
+ '--max-kbps 10000 '
+ '--max-burst-kbits 1400 '
+ '--egress %s' %
self.QOS_POLICY_NAME
))
self.RULE_ID = cmd_output['id']
self.addCleanup(self.openstack,
- 'network qos rule delete ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID)
+ 'network qos rule delete %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID))
self.assertTrue(self.RULE_ID)
def test_qos_rule_create_delete(self):
# This is to check the output of qos rule delete
policy_name = uuid.uuid4().hex
- self.openstack('network qos policy create -f json ' + policy_name)
+ self.openstack('network qos policy create -f json %s' % policy_name)
self.addCleanup(self.openstack,
- 'network qos policy delete ' + policy_name)
+ 'network qos policy delete %s' % policy_name)
rule = json.loads(self.openstack(
- 'network qos rule create -f json ' +
- '--type bandwidth-limit ' +
- '--max-kbps 10000 ' +
- '--max-burst-kbits 1400 ' +
- '--egress ' + policy_name
+ 'network qos rule create -f json '
+ '--type bandwidth-limit '
+ '--max-kbps 10000 '
+ '--max-burst-kbits 1400 '
+ '--egress %s' % policy_name
))
raw_output = self.openstack(
- 'network qos rule delete ' +
- policy_name + ' ' + rule['id'])
+ 'network qos rule delete %s %s' %
+ (policy_name, rule['id']))
self.assertEqual('', raw_output)
def test_qos_rule_list(self):
cmd_output = json.loads(self.openstack(
- 'network qos rule list -f json '
- + self.QOS_POLICY_NAME))
+ 'network qos rule list -f json %s' %
+ self.QOS_POLICY_NAME))
self.assertIn(self.RULE_ID, [rule['ID'] for rule in cmd_output])
def test_qos_rule_show(self):
cmd_output = json.loads(self.openstack(
- 'network qos rule show -f json ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID))
+ 'network qos rule show -f json %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID)))
self.assertEqual(self.RULE_ID, cmd_output['id'])
def test_qos_rule_set(self):
- self.openstack('network qos rule set --max-kbps 15000 ' +
- '--max-burst-kbits 1800 ' +
- '--ingress ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID)
+ self.openstack('network qos rule set --max-kbps 15000 '
+ '--max-burst-kbits 1800 '
+ '--ingress %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID))
cmd_output = json.loads(self.openstack(
- 'network qos rule show -f json ' +
- self.QOS_POLICY_NAME + ' ' + self.RULE_ID))
+ 'network qos rule show -f json %s %s' %
+ (self.QOS_POLICY_NAME, self.RULE_ID)))
self.assertEqual(15000, cmd_output['max_kbps'])
self.assertEqual(1800, cmd_output['max_burst_kbps'])
self.assertEqual('ingress', cmd_output['direction'])
diff --git a/openstackclient/tests/functional/network/v2/test_port.py b/openstackclient/tests/functional/network/v2/test_port.py
index 7357c0e..e3067d9 100644
--- a/openstackclient/tests/functional/network/v2/test_port.py
+++ b/openstackclient/tests/functional/network/v2/test_port.py
@@ -33,7 +33,7 @@ class PortTests(common.NetworkTagTests):
# Create a network for the port tests
cls.openstack(
- 'network create ' + cls.NETWORK_NAME
+ 'network create %s' % cls.NETWORK_NAME
)
@classmethod
@@ -41,7 +41,7 @@ class PortTests(common.NetworkTagTests):
try:
if cls.haz_network:
raw_output = cls.openstack(
- 'network delete ' + cls.NETWORK_NAME
+ 'network delete %s' % cls.NETWORK_NAME
)
cls.assertOutput('', raw_output)
finally:
@@ -56,8 +56,8 @@ class PortTests(common.NetworkTagTests):
def test_port_delete(self):
"""Test create, delete multiple"""
json_output = json.loads(self.openstack(
- 'port create -f json --network ' +
- self.NETWORK_NAME + ' ' + self.NAME
+ 'port create -f json --network %s %s' %
+ (self.NETWORK_NAME, self.NAME)
))
id1 = json_output.get('id')
self.assertIsNotNone(id1)
@@ -65,8 +65,8 @@ class PortTests(common.NetworkTagTests):
self.assertEqual(self.NAME, json_output.get('name'))
json_output = json.loads(self.openstack(
- 'port create -f json --network ' + self.NETWORK_NAME + ' ' +
- self.NAME + 'x'
+ 'port create -f json --network %s %sx' %
+ (self.NETWORK_NAME, self.NAME)
))
id2 = json_output.get('id')
self.assertIsNotNone(id2)
@@ -74,31 +74,31 @@ class PortTests(common.NetworkTagTests):
self.assertEqual(self.NAME + 'x', json_output.get('name'))
# Clean up after ourselves
- raw_output = self.openstack('port delete ' + id1 + ' ' + id2)
+ raw_output = self.openstack('port delete %s %s' % (id1, id2))
self.assertOutput('', raw_output)
def test_port_list(self):
"""Test create defaults, list, delete"""
json_output = json.loads(self.openstack(
- 'port create -f json --network ' + self.NETWORK_NAME + ' ' +
- self.NAME
+ 'port create -f json --network %s %s' %
+ (self.NETWORK_NAME, self.NAME)
))
id1 = json_output.get('id')
self.assertIsNotNone(id1)
mac1 = json_output.get('mac_address')
self.assertIsNotNone(mac1)
- self.addCleanup(self.openstack, 'port delete ' + id1)
+ self.addCleanup(self.openstack, 'port delete %s' % id1)
self.assertEqual(self.NAME, json_output.get('name'))
json_output = json.loads(self.openstack(
- 'port create -f json --network ' + self.NETWORK_NAME + ' ' +
- self.NAME + 'x'
+ 'port create -f json --network %s %sx' %
+ (self.NETWORK_NAME, self.NAME)
))
id2 = json_output.get('id')
self.assertIsNotNone(id2)
mac2 = json_output.get('mac_address')
self.assertIsNotNone(mac2)
- self.addCleanup(self.openstack, 'port delete ' + id2)
+ self.addCleanup(self.openstack, 'port delete %s' % id2)
self.assertEqual(self.NAME + 'x', json_output.get('name'))
# Test list
@@ -122,7 +122,7 @@ class PortTests(common.NetworkTagTests):
# Test list --mac-address
json_output = json.loads(self.openstack(
- 'port list -f json --mac-address ' + mac2
+ 'port list -f json --mac-address %s' % mac2
))
item_map = {item.get('ID'): item.get('MAC Address') for item in
json_output}
@@ -145,26 +145,26 @@ class PortTests(common.NetworkTagTests):
"""Test create, set, show, delete"""
name = uuid.uuid4().hex
json_output = json.loads(self.openstack(
- 'port create -f json ' +
- '--network ' + self.NETWORK_NAME + ' ' +
- '--description xyzpdq ' +
- '--disable ' +
- name
+ 'port create -f json '
+ '--network %s '
+ '--description xyzpdq '
+ '--disable %s' %
+ (self.NETWORK_NAME, name)
))
id1 = json_output.get('id')
- self.addCleanup(self.openstack, 'port delete ' + id1)
+ self.addCleanup(self.openstack, 'port delete %s' % id1)
self.assertEqual(name, json_output.get('name'))
self.assertEqual('xyzpdq', json_output.get('description'))
self.assertEqual('DOWN', json_output.get('admin_state_up'))
raw_output = self.openstack(
- 'port set ' + '--enable ' +
+ 'port set --enable %s' %
name
)
self.assertOutput('', raw_output)
json_output = json.loads(self.openstack(
- 'port show -f json ' + name
+ 'port show -f json %s' % name
))
sg_id = json_output.get('security_group_ids')
@@ -174,30 +174,30 @@ class PortTests(common.NetworkTagTests):
self.assertIsNotNone(json_output.get('mac_address'))
raw_output = self.openstack(
- 'port unset --security-group ' + sg_id + ' ' + id1)
+ 'port unset --security-group %s %s' % (sg_id, id1))
self.assertOutput('', raw_output)
json_output = json.loads(self.openstack(
- 'port show -f json ' + name
+ 'port show -f json %s' % name
))
self.assertEqual('', json_output.get('security_group_ids'))
def test_port_admin_set(self):
"""Test create, set (as admin), show, delete"""
json_output = json.loads(self.openstack(
- 'port create -f json ' +
- '--network ' + self.NETWORK_NAME + ' ' + self.NAME
+ 'port create -f json '
+ '--network %s %s' % (self.NETWORK_NAME, self.NAME)
))
id_ = json_output.get('id')
- self.addCleanup(self.openstack, 'port delete ' + id_)
+ self.addCleanup(self.openstack, 'port delete %s' % id_)
raw_output = self.openstack(
'--os-username admin '
- + 'port set --mac-address 11:22:33:44:55:66 '
- + self.NAME)
+ 'port set --mac-address 11:22:33:44:55:66 %s' %
+ self.NAME)
self.assertOutput('', raw_output)
json_output = json.loads(self.openstack(
- 'port show -f json ' + self.NAME
+ 'port show -f json %s' % self.NAME
))
self.assertEqual(json_output.get('mac_address'), '11:22:33:44:55:66')
@@ -205,41 +205,41 @@ class PortTests(common.NetworkTagTests):
"""Test create, set, show, delete"""
sg_name1 = uuid.uuid4().hex
json_output = json.loads(self.openstack(
- 'security group create -f json ' +
+ 'security group create -f json %s' %
sg_name1
))
sg_id1 = json_output.get('id')
- self.addCleanup(self.openstack, 'security group delete ' + sg_id1)
+ self.addCleanup(self.openstack, 'security group delete %s' % sg_id1)
sg_name2 = uuid.uuid4().hex
json_output = json.loads(self.openstack(
- 'security group create -f json ' +
+ 'security group create -f json %s' %
sg_name2
))
sg_id2 = json_output.get('id')
- self.addCleanup(self.openstack, 'security group delete ' + sg_id2)
+ self.addCleanup(self.openstack, 'security group delete %s' % sg_id2)
name = uuid.uuid4().hex
json_output = json.loads(self.openstack(
- 'port create -f json ' +
- '--network ' + self.NETWORK_NAME + ' ' +
- '--security-group ' + sg_name1 + ' ' +
- name
+ 'port create -f json '
+ '--network %s '
+ '--security-group %s %s' %
+ (self.NETWORK_NAME, sg_name1, name)
))
id1 = json_output.get('id')
- self.addCleanup(self.openstack, 'port delete ' + id1)
+ self.addCleanup(self.openstack, 'port delete %s' % id1)
self.assertEqual(name, json_output.get('name'))
self.assertEqual(sg_id1, json_output.get('security_group_ids'))
raw_output = self.openstack(
- 'port set ' +
- '--security-group ' + sg_name2 + ' ' +
- name
+ 'port set '
+ '--security-group %s %s' %
+ (sg_name2, name)
)
self.assertOutput('', raw_output)
json_output = json.loads(self.openstack(
- 'port show -f json ' + name
+ 'port show -f json %s' % name
))
self.assertEqual(name, json_output.get('name'))
self.assertIn(
@@ -254,11 +254,11 @@ class PortTests(common.NetworkTagTests):
)
raw_output = self.openstack(
- 'port unset --security-group ' + sg_id1 + ' ' + id1)
+ 'port unset --security-group %s %s' % (sg_id1, id1))
self.assertOutput('', raw_output)
json_output = json.loads(self.openstack(
- 'port show -f json ' + name
+ 'port show -f json %s' % name
))
self.assertEqual(
# TODO(dtroyer): output formatters should do this on JSON!
diff --git a/openstackclient/tests/functional/object/v1/test_object.py b/openstackclient/tests/functional/object/v1/test_object.py
index d1a73c5..226ef8a 100644
--- a/openstackclient/tests/functional/object/v1/test_object.py
+++ b/openstackclient/tests/functional/object/v1/test_object.py
@@ -53,39 +53,39 @@ class ObjectTests(common.ObjectStoreTests):
self.openstack('container save ' + self.CONTAINER_NAME)
# TODO(stevemar): Assert returned fields
- raw_output = self.openstack('object create ' + self.CONTAINER_NAME
- + ' ' + object_file)
+ raw_output = self.openstack('object create %s %s' %
+ (self.CONTAINER_NAME, object_file))
items = self.parse_listing(raw_output)
self.assert_show_fields(items, OBJECT_FIELDS)
- raw_output = self.openstack('object list ' + self.CONTAINER_NAME)
+ raw_output = self.openstack('object list %s' % self.CONTAINER_NAME)
items = self.parse_listing(raw_output)
self.assert_table_structure(items, BASIC_LIST_HEADERS)
- self.openstack('object save ' + self.CONTAINER_NAME
- + ' ' + object_file)
+ self.openstack('object save %s %s' %
+ (self.CONTAINER_NAME, object_file))
# TODO(stevemar): Assert returned fields
tmp_file = 'tmp.txt'
self.addCleanup(os.remove, tmp_file)
- self.openstack('object save ' + self.CONTAINER_NAME
- + ' ' + object_file + ' --file ' + tmp_file)
+ self.openstack('object save %s %s --file %s' %
+ (self.CONTAINER_NAME, object_file, tmp_file))
# TODO(stevemar): Assert returned fields
- raw_output = self.openstack('object save ' + self.CONTAINER_NAME
- + ' ' + object_file + ' --file -')
+ raw_output = self.openstack('object save %s %s --file -' %
+ (self.CONTAINER_NAME, object_file))
self.assertEqual(raw_output, 'test content')
- self.openstack('object show ' + self.CONTAINER_NAME
- + ' ' + object_file)
+ self.openstack('object show %s %s' %
+ (self.CONTAINER_NAME, object_file))
# TODO(stevemar): Assert returned fields
- raw_output = self.openstack('object delete ' + self.CONTAINER_NAME
- + ' ' + object_file)
+ raw_output = self.openstack('object delete %s %s' %
+ (self.CONTAINER_NAME, object_file))
self.assertEqual(0, len(raw_output))
- self.openstack('object create ' + self.CONTAINER_NAME
- + ' ' + object_file)
- raw_output = self.openstack('container delete -r ' +
+ self.openstack('object create %s %s' %
+ (self.CONTAINER_NAME, object_file))
+ raw_output = self.openstack('container delete -r %s' %
self.CONTAINER_NAME)
self.assertEqual(0, len(raw_output))
diff --git a/openstackclient/tests/functional/volume/v1/test_volume_type.py b/openstackclient/tests/functional/volume/v1/test_volume_type.py
index 74e1407..c5886a6 100644
--- a/openstackclient/tests/functional/volume/v1/test_volume_type.py
+++ b/openstackclient/tests/functional/volume/v1/test_volume_type.py
@@ -26,13 +26,13 @@ class VolumeTypeTests(common.BaseVolumeTests):
def setUpClass(cls):
super(VolumeTypeTests, cls).setUpClass()
cmd_output = json.loads(cls.openstack(
- 'volume type create -f json ' + cls.NAME))
+ 'volume type create -f json %s' % cls.NAME))
cls.assertOutput(cls.NAME, cmd_output['name'])
@classmethod
def tearDownClass(cls):
try:
- raw_output = cls.openstack('volume type delete ' + cls.NAME)
+ raw_output = cls.openstack('volume type delete %s' % cls.NAME)
cls.assertOutput('', raw_output)
finally:
super(VolumeTypeTests, cls).tearDownClass()
@@ -43,47 +43,47 @@ class VolumeTypeTests(common.BaseVolumeTests):
def test_volume_type_show(self):
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual(self.NAME, cmd_output['name'])
def test_volume_type_set_unset_properties(self):
raw_output = self.openstack(
- 'volume type set --property a=b --property c=d ' + self.NAME)
+ 'volume type set --property a=b --property c=d %s' % self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
'volume type show -f json ' + self.NAME))
self.assertEqual("a='b', c='d'", cmd_output['properties'])
- raw_output = self.openstack('volume type unset --property a '
- + self.NAME)
+ raw_output = self.openstack('volume type unset --property a %s' %
+ self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual("c='d'", cmd_output['properties'])
def test_volume_type_set_unset_multiple_properties(self):
raw_output = self.openstack(
- 'volume type set --property a=b --property c=d ' + self.NAME)
+ 'volume type set --property a=b --property c=d %s' % self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual("a='b', c='d'", cmd_output['properties'])
raw_output = self.openstack(
- 'volume type unset --property a --property c ' + self.NAME)
+ 'volume type unset --property a --property c %s' % self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual("", cmd_output['properties'])
def test_multi_delete(self):
vol_type1 = uuid.uuid4().hex
vol_type2 = uuid.uuid4().hex
- self.openstack('volume type create ' + vol_type1)
+ self.openstack('volume type create %s' % vol_type1)
time.sleep(5)
- self.openstack('volume type create ' + vol_type2)
+ self.openstack('volume type create %s' % vol_type2)
time.sleep(5)
cmd = 'volume type delete %s %s' % (vol_type1, vol_type2)
raw_output = self.openstack(cmd)
diff --git a/openstackclient/tests/functional/volume/v2/test_volume_type.py b/openstackclient/tests/functional/volume/v2/test_volume_type.py
index 99630e6..5c551ca 100644
--- a/openstackclient/tests/functional/volume/v2/test_volume_type.py
+++ b/openstackclient/tests/functional/volume/v2/test_volume_type.py
@@ -26,13 +26,13 @@ class VolumeTypeTests(common.BaseVolumeTests):
def setUpClass(cls):
super(VolumeTypeTests, cls).setUpClass()
cmd_output = json.loads(cls.openstack(
- 'volume type create -f json --private ' + cls.NAME))
+ 'volume type create -f json --private %s' % cls.NAME))
cls.assertOutput(cls.NAME, cmd_output['name'])
@classmethod
def tearDownClass(cls):
try:
- raw_output = cls.openstack('volume type delete ' + cls.NAME)
+ raw_output = cls.openstack('volume type delete %s' % cls.NAME)
cls.assertOutput('', raw_output)
finally:
super(VolumeTypeTests, cls).tearDownClass()
@@ -49,55 +49,55 @@ class VolumeTypeTests(common.BaseVolumeTests):
def test_volume_type_show(self):
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual(self.NAME, cmd_output['name'])
def test_volume_type_set_unset_properties(self):
raw_output = self.openstack(
- 'volume type set --property a=b --property c=d ' + self.NAME)
+ 'volume type set --property a=b --property c=d %s' % self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
# TODO(amotoki): properties output should be machine-readable
self.assertEqual("a='b', c='d'", cmd_output['properties'])
- raw_output = self.openstack('volume type unset --property a '
- + self.NAME)
+ raw_output = self.openstack('volume type unset --property a %s' %
+ self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual("c='d'", cmd_output['properties'])
def test_volume_type_set_unset_multiple_properties(self):
raw_output = self.openstack(
- 'volume type set --property a=b --property c=d ' + self.NAME)
+ 'volume type set --property a=b --property c=d %s' % self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual("a='b', c='d'", cmd_output['properties'])
raw_output = self.openstack(
- 'volume type unset --property a --property c ' + self.NAME)
+ 'volume type unset --property a --property c %s' % self.NAME)
self.assertEqual("", raw_output)
cmd_output = json.loads(self.openstack(
- 'volume type show -f json ' + self.NAME))
+ 'volume type show -f json %s' % self.NAME))
self.assertEqual("", cmd_output['properties'])
def test_volume_type_set_unset_project(self):
raw_output = self.openstack(
- 'volume type set --project admin ' + self.NAME)
+ 'volume type set --project admin %s' % self.NAME)
self.assertEqual("", raw_output)
raw_output = self.openstack(
- 'volume type unset --project admin ' + self.NAME)
+ 'volume type unset --project admin %s' % self.NAME)
self.assertEqual("", raw_output)
def test_multi_delete(self):
vol_type1 = uuid.uuid4().hex
vol_type2 = uuid.uuid4().hex
- self.openstack('volume type create ' + vol_type1)
+ self.openstack('volume type create %s' % vol_type1)
time.sleep(5)
- self.openstack('volume type create ' + vol_type2)
+ self.openstack('volume type create %s' % vol_type2)
time.sleep(5)
cmd = 'volume type delete %s %s' % (vol_type1, vol_type2)
raw_output = self.openstack(cmd)
diff --git a/openstackclient/tests/unit/api/test_compute_v2.py b/openstackclient/tests/unit/api/test_compute_v2.py
index 4f3b803..edf5258 100644
--- a/openstackclient/tests/unit/api/test_compute_v2.py
+++ b/openstackclient/tests/unit/api/test_compute_v2.py
@@ -55,6 +55,43 @@ class TestFloatingIP(TestComputeAPIv2):
FAKE_FLOATING_IP_RESP_2,
]
+ FAKE_SERVER_RESP_1 = {
+ 'id': 1,
+ 'name': 'server1',
+ }
+
+ def test_floating_ip_add_id(self):
+ self.requests_mock.register_uri(
+ 'POST',
+ FAKE_URL + '/servers/1/action',
+ json={'server': {}},
+ status_code=200,
+ )
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/servers/1',
+ json={'server': self.FAKE_SERVER_RESP_1},
+ status_code=200,
+ )
+ ret = self.api.floating_ip_add('1', '1.0.1.0')
+ self.assertEqual(200, ret.status_code)
+
+ def test_floating_ip_add_name(self):
+ self.requests_mock.register_uri(
+ 'POST',
+ FAKE_URL + '/servers/1/action',
+ json={'server': {}},
+ status_code=200,
+ )
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/servers/server1',
+ json={'server': self.FAKE_SERVER_RESP_1},
+ status_code=200,
+ )
+ ret = self.api.floating_ip_add('server1', '1.0.1.0')
+ self.assertEqual(200, ret.status_code)
+
def test_floating_ip_create(self):
self.requests_mock.register_uri(
'POST',
@@ -144,6 +181,36 @@ class TestFloatingIP(TestComputeAPIv2):
ret = self.api.floating_ip_list()
self.assertEqual(self.LIST_FLOATING_IP_RESP, ret)
+ def test_floating_ip_remove_id(self):
+ self.requests_mock.register_uri(
+ 'POST',
+ FAKE_URL + '/servers/1/action',
+ status_code=200,
+ )
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/servers/1',
+ json={'server': self.FAKE_SERVER_RESP_1},
+ status_code=200,
+ )
+ ret = self.api.floating_ip_remove('1', '1.0.1.0')
+ self.assertEqual(200, ret.status_code)
+
+ def test_floating_ip_remove_name(self):
+ self.requests_mock.register_uri(
+ 'POST',
+ FAKE_URL + '/servers/1/action',
+ status_code=200,
+ )
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/servers/server1',
+ json={'server': self.FAKE_SERVER_RESP_1},
+ status_code=200,
+ )
+ ret = self.api.floating_ip_remove('server1', '1.0.1.0')
+ self.assertEqual(200, ret.status_code)
+
class TestFloatingIPPool(TestComputeAPIv2):
@@ -163,6 +230,115 @@ class TestFloatingIPPool(TestComputeAPIv2):
self.assertEqual(self.LIST_FLOATING_IP_POOL_RESP, ret)
+class TestHost(TestComputeAPIv2):
+
+ FAKE_HOST_RESP_1 = {
+ "zone": "internal",
+ "host_name": "myhost",
+ "service": "conductor",
+ }
+
+ FAKE_HOST_RESP_2 = {
+ "zone": "internal",
+ "host_name": "myhost",
+ "service": "scheduler",
+ }
+
+ FAKE_HOST_RESP_3 = {
+ "zone": "nova",
+ "host_name": "myhost",
+ "service": "compute",
+ }
+
+ LIST_HOST_RESP = [
+ FAKE_HOST_RESP_1,
+ FAKE_HOST_RESP_2,
+ FAKE_HOST_RESP_3,
+ ]
+
+ def test_host_list_no_options(self):
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/os-hosts',
+ json={'hosts': self.LIST_HOST_RESP},
+ status_code=200,
+ )
+ ret = self.api.host_list()
+ self.assertEqual(self.LIST_HOST_RESP, ret)
+
+ def test_host_list_zone(self):
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/os-hosts?zone=nova',
+ json={'hosts': [self.FAKE_HOST_RESP_3]},
+ status_code=200,
+ )
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/os-hosts',
+ json={'hosts': [self.FAKE_HOST_RESP_3]},
+ status_code=200,
+ )
+ ret = self.api.host_list(zone='nova')
+ self.assertEqual([self.FAKE_HOST_RESP_3], ret)
+
+ def test_host_set_none(self):
+ ret = self.api.host_set(host='myhost')
+ self.assertIsNone(ret)
+
+ def test_host_set(self):
+ self.requests_mock.register_uri(
+ 'PUT',
+ FAKE_URL + '/os-hosts/myhost',
+ json={},
+ status_code=200,
+ )
+ ret = self.api.host_set(host='myhost', status='enabled')
+ self.assertEqual({}, ret)
+
+ def test_host_show(self):
+ FAKE_RESOURCE_1 = {
+ "cpu": 2,
+ "disk_gb": 1028,
+ "host": "c1a7de0ac9d94e4baceae031d05caae3",
+ "memory_mb": 8192,
+ "project": "(total)",
+ }
+ FAKE_RESOURCE_2 = {
+ "cpu": 0,
+ "disk_gb": 0,
+ "host": "c1a7de0ac9d94e4baceae031d05caae3",
+ "memory_mb": 512,
+ "project": "(used_now)",
+ }
+ FAKE_RESOURCE_3 = {
+ "cpu": 0,
+ "disk_gb": 0,
+ "host": "c1a7de0ac9d94e4baceae031d05caae3",
+ "memory_mb": 0,
+ "project": "(used_max)",
+ }
+ FAKE_HOST_RESP = [
+ {'resource': FAKE_RESOURCE_1},
+ {'resource': FAKE_RESOURCE_2},
+ {'resource': FAKE_RESOURCE_3},
+ ]
+ FAKE_HOST_LIST = [
+ FAKE_RESOURCE_1,
+ FAKE_RESOURCE_2,
+ FAKE_RESOURCE_3,
+ ]
+
+ self.requests_mock.register_uri(
+ 'GET',
+ FAKE_URL + '/os-hosts/myhost',
+ json={'host': FAKE_HOST_RESP},
+ status_code=200,
+ )
+ ret = self.api.host_show(host='myhost')
+ self.assertEqual(FAKE_HOST_LIST, ret)
+
+
class TestNetwork(TestComputeAPIv2):
FAKE_NETWORK_RESP = {
diff --git a/openstackclient/tests/unit/compute/v2/fakes.py b/openstackclient/tests/unit/compute/v2/fakes.py
index 0fae19a..1ec7178 100644
--- a/openstackclient/tests/unit/compute/v2/fakes.py
+++ b/openstackclient/tests/unit/compute/v2/fakes.py
@@ -1230,10 +1230,7 @@ class FakeHost(object):
'project': 'project-' + uuid.uuid4().hex,
}
host_info.update(attrs)
- host = fakes.FakeResource(
- info=copy.deepcopy(host_info),
- loaded=True)
- return host
+ return host_info
class FakeServerGroup(object):
diff --git a/openstackclient/tests/unit/compute/v2/test_host.py b/openstackclient/tests/unit/compute/v2/test_host.py
index a388172..329095d 100644
--- a/openstackclient/tests/unit/compute/v2/test_host.py
+++ b/openstackclient/tests/unit/compute/v2/test_host.py
@@ -13,6 +13,8 @@
# under the License.
#
+import mock
+
from openstackclient.compute.v2 import host
from openstackclient.tests.unit.compute.v2 import fakes as compute_fakes
from openstackclient.tests.unit import utils as tests_utils
@@ -23,11 +25,13 @@ class TestHost(compute_fakes.TestComputev2):
def setUp(self):
super(TestHost, self).setUp()
- # Get a shortcut to the FlavorManager Mock
- self.host_mock = self.app.client_manager.compute.hosts
- self.host_mock.reset_mock()
+ # Get a shortcut to the compute client
+ self.compute = self.app.client_manager.compute
+@mock.patch(
+ 'openstackclient.api.compute_v2.APIv2.host_list'
+)
class TestHostList(TestHost):
host = compute_fakes.FakeHost.create_one_host()
@@ -39,19 +43,18 @@ class TestHostList(TestHost):
)
data = [(
- host.host_name,
- host.service,
- host.zone,
+ host['host_name'],
+ host['service'],
+ host['zone'],
)]
def setUp(self):
super(TestHostList, self).setUp()
- self.host_mock.list_all.return_value = [self.host]
-
self.cmd = host.ListHost(self.app, None)
- def test_host_list_no_option(self):
+ def test_host_list_no_option(self, h_mock):
+ h_mock.return_value = [self.host]
arglist = []
verifylist = []
@@ -59,44 +62,48 @@ class TestHostList(TestHost):
columns, data = self.cmd.take_action(parsed_args)
- self.host_mock.list_all.assert_called_with(None)
+ h_mock.assert_called_with(None)
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
- def test_host_list_with_option(self):
+ def test_host_list_with_option(self, h_mock):
+ h_mock.return_value = [self.host]
arglist = [
- '--zone', self.host.zone,
+ '--zone', self.host['zone'],
]
verifylist = [
- ('zone', self.host.zone),
+ ('zone', self.host['zone']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.host_mock.list_all.assert_called_with(self.host.zone)
+ h_mock.assert_called_with(self.host['zone'])
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
+@mock.patch(
+ 'openstackclient.api.compute_v2.APIv2.host_set'
+)
class TestHostSet(TestHost):
def setUp(self):
super(TestHostSet, self).setUp()
self.host = compute_fakes.FakeHost.create_one_host()
- self.host_mock.get.return_value = self.host
- self.host_mock.update.return_value = None
self.cmd = host.SetHost(self.app, None)
- def test_host_set_no_option(self):
+ def test_host_set_no_option(self, h_mock):
+ h_mock.return_value = self.host
+ h_mock.update.return_value = None
arglist = [
- self.host.host
+ self.host['host'],
]
verifylist = [
- ('host', self.host.host)
+ ('host', self.host['host']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -105,18 +112,20 @@ class TestHostSet(TestHost):
self.assertIsNone(result)
body = {}
- self.host_mock.update.assert_called_with(self.host.host, body)
+ h_mock.assert_called_with(self.host['host'], body)
- def test_host_set(self):
+ def test_host_set(self, h_mock):
+ h_mock.return_value = self.host
+ h_mock.update.return_value = None
arglist = [
'--enable',
'--disable-maintenance',
- self.host.host
+ self.host['host'],
]
verifylist = [
('enable', True),
('enable_maintenance', False),
- ('host', self.host.host)
+ ('host', self.host['host']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
@@ -125,9 +134,12 @@ class TestHostSet(TestHost):
self.assertIsNone(result)
body = {'status': 'enable', 'maintenance_mode': 'disable'}
- self.host_mock.update.assert_called_with(self.host.host, body)
+ h_mock.assert_called_with(self.host['host'], body)
+@mock.patch(
+ 'openstackclient.api.compute_v2.APIv2.host_show'
+)
class TestHostShow(TestHost):
host = compute_fakes.FakeHost.create_one_host()
@@ -139,22 +151,22 @@ class TestHostShow(TestHost):
'Memory MB',
'Disk GB',
)
+
data = [(
- host.host,
- host.project,
- host.cpu,
- host.memory_mb,
- host.disk_gb,
+ host['host'],
+ host['project'],
+ host['cpu'],
+ host['memory_mb'],
+ host['disk_gb'],
)]
def setUp(self):
super(TestHostShow, self).setUp()
- self.host_mock.get.return_value = [self.host]
-
self.cmd = host.ShowHost(self.app, None)
- def test_host_show_no_option(self):
+ def test_host_show_no_option(self, h_mock):
+ h_mock.host_show.return_value = [self.host]
arglist = []
verifylist = []
@@ -162,18 +174,19 @@ class TestHostShow(TestHost):
self.assertRaises(tests_utils.ParserException, self.check_parser,
self.cmd, arglist, verifylist)
- def test_host_show_with_option(self):
+ def test_host_show_with_option(self, h_mock):
+ h_mock.return_value = [self.host]
arglist = [
- self.host.host_name,
+ self.host['host_name'],
]
verifylist = [
- ('host', self.host.host_name),
+ ('host', self.host['host_name']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
columns, data = self.cmd.take_action(parsed_args)
- self.host_mock.get.assert_called_with(self.host.host_name)
+ h_mock.assert_called_with(self.host['host_name'])
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
diff --git a/openstackclient/tests/unit/compute/v2/test_server.py b/openstackclient/tests/unit/compute/v2/test_server.py
index c4e125b..87c9a98 100644
--- a/openstackclient/tests/unit/compute/v2/test_server.py
+++ b/openstackclient/tests/unit/compute/v2/test_server.py
@@ -141,48 +141,148 @@ class TestServerAddFixedIP(TestServer):
self._test_server_add_fixed_ip(extralist, '5.6.7.8')
-class TestServerAddFloatingIP(TestServer):
+@mock.patch(
+ 'openstackclient.api.compute_v2.APIv2.floating_ip_add'
+)
+class TestServerAddFloatingIPCompute(compute_fakes.TestComputev2):
def setUp(self):
- super(TestServerAddFloatingIP, self).setUp()
+ super(TestServerAddFloatingIPCompute, self).setUp()
+
+ self.app.client_manager.network_endpoint_enabled = False
# Get the command object to test
self.cmd = server.AddFloatingIP(self.app, None)
- # Set add_floating_ip method to be tested.
- self.methods = {
- 'add_floating_ip': None,
- }
+ def test_server_add_floating_ip_default(self, fip_mock):
+ _floating_ip = compute_fakes.FakeFloatingIP.create_one_floating_ip()
+ arglist = [
+ 'server1',
+ _floating_ip['ip'],
+ ]
+ verifylist = [
+ ('server', 'server1'),
+ ('ip_address', _floating_ip['ip']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- self.find_port = mock.Mock()
- self.app.client_manager.network.find_port = self.find_port
+ self.cmd.take_action(parsed_args)
- def _test_server_add_floating_ip(self, extralist, fixed_ip_address):
- servers = self.setup_servers_mock(count=1)
+ fip_mock.assert_called_once_with(
+ 'server1',
+ _floating_ip['ip'],
+ fixed_address=None,
+ )
+ def test_server_add_floating_ip_fixed(self, fip_mock):
+ _floating_ip = compute_fakes.FakeFloatingIP.create_one_floating_ip()
arglist = [
- servers[0].id,
- '1.2.3.4',
- ] + extralist
+ '--fixed-ip-address', _floating_ip['fixed_ip'],
+ 'server1',
+ _floating_ip['ip'],
+ ]
verifylist = [
- ('server', servers[0].id),
- ('ip_address', '1.2.3.4'),
- ('fixed_ip_address', fixed_ip_address),
+ ('fixed_ip_address', _floating_ip['fixed_ip']),
+ ('server', 'server1'),
+ ('ip_address', _floating_ip['ip']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- result = self.cmd.take_action(parsed_args)
+ self.cmd.take_action(parsed_args)
- servers[0].add_floating_ip.assert_called_once_with('1.2.3.4',
- fixed_ip_address)
- self.assertIsNone(result)
+ fip_mock.assert_called_once_with(
+ 'server1',
+ _floating_ip['ip'],
+ fixed_address=_floating_ip['fixed_ip'],
+ )
- def test_server_add_floating_ip(self):
- self._test_server_add_floating_ip([], None)
- def test_server_add_floating_ip_to_fixed_ip(self):
- extralist = ['--fixed-ip-address', '5.6.7.8']
- self._test_server_add_floating_ip(extralist, '5.6.7.8')
+class TestServerAddFloatingIPNetwork(
+ TestServer,
+ network_fakes.TestNetworkV2,
+):
+
+ def setUp(self):
+ super(TestServerAddFloatingIPNetwork, self).setUp()
+
+ self.app.client_manager.network = mock.Mock()
+ self.network = self.app.client_manager.network
+ self.network.update_ip = mock.Mock(return_value=None)
+
+ # Get the command object to test
+ self.cmd = server.AddFloatingIP(self.app, self.namespace)
+
+ def test_server_add_floating_ip_default(self):
+ _server = compute_fakes.FakeServer.create_one_server()
+ self.servers_mock.get.return_value = _server
+ _port = network_fakes.FakePort.create_one_port()
+ _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
+ self.network.find_ip = mock.Mock(return_value=_floating_ip)
+ self.network.ports = mock.Mock(return_value=[_port])
+ arglist = [
+ _server.id,
+ _floating_ip['ip'],
+ ]
+ verifylist = [
+ ('server', _server.id),
+ ('ip_address', _floating_ip['ip']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'port_id': _port.id,
+ }
+
+ self.network.find_ip.assert_called_once_with(
+ _floating_ip['ip'],
+ ignore_missing=False,
+ )
+ self.network.ports.assert_called_once_with(
+ device_id=_server.id,
+ )
+ self.network.update_ip.assert_called_once_with(
+ _floating_ip,
+ **attrs
+ )
+
+ def test_server_add_floating_ip_fixed(self):
+ _server = compute_fakes.FakeServer.create_one_server()
+ self.servers_mock.get.return_value = _server
+ _port = network_fakes.FakePort.create_one_port()
+ _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
+ self.network.find_ip = mock.Mock(return_value=_floating_ip)
+ self.network.ports = mock.Mock(return_value=[_port])
+ arglist = [
+ '--fixed-ip-address', _floating_ip['fixed_ip'],
+ _server.id,
+ _floating_ip['ip'],
+ ]
+ verifylist = [
+ ('fixed_ip_address', _floating_ip['fixed_ip']),
+ ('server', _server.id),
+ ('ip_address', _floating_ip['ip']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ attrs = {
+ 'port_id': _port.id,
+ }
+
+ self.network.find_ip.assert_called_once_with(
+ _floating_ip['ip'],
+ ignore_missing=False,
+ )
+ self.network.ports.assert_called_once_with(
+ device_id=_server.id,
+ )
+ self.network.update_ip.assert_called_once_with(
+ _floating_ip,
+ **attrs
+ )
class TestServerAddPort(TestServer):
@@ -2302,36 +2402,80 @@ class TestServerRescue(TestServer):
self.server.rescue.assert_called_with(image=None, password=password)
-class TestServerRemoveFloatingIP(TestServer):
+@mock.patch(
+ 'openstackclient.api.compute_v2.APIv2.floating_ip_remove'
+)
+class TestServerRemoveFloatingIPCompute(compute_fakes.TestComputev2):
def setUp(self):
- super(TestServerRemoveFloatingIP, self).setUp()
+ super(TestServerRemoveFloatingIPCompute, self).setUp()
+
+ self.app.client_manager.network_endpoint_enabled = False
# Get the command object to test
self.cmd = server.RemoveFloatingIP(self.app, None)
- # Set unshelve method to be tested.
- self.methods = {
- 'remove_floating_ip': None,
- }
+ def test_server_remove_floating_ip(self, fip_mock):
+ _floating_ip = compute_fakes.FakeFloatingIP.create_one_floating_ip()
- def test_server_remove_floating_ip(self):
- servers = self.setup_servers_mock(count=1)
+ arglist = [
+ 'server1',
+ _floating_ip['ip'],
+ ]
+ verifylist = [
+ ('server', 'server1'),
+ ('ip_address', _floating_ip['ip']),
+ ]
+ parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+ self.cmd.take_action(parsed_args)
+
+ fip_mock.assert_called_once_with(
+ 'server1',
+ _floating_ip['ip'],
+ )
+
+
+class TestServerRemoveFloatingIPNetwork(network_fakes.TestNetworkV2):
+
+ def setUp(self):
+ super(TestServerRemoveFloatingIPNetwork, self).setUp()
+
+ self.app.client_manager.network = mock.Mock()
+ self.network = self.app.client_manager.network
+ self.network.update_ip = mock.Mock(return_value=None)
+
+ # Get the command object to test
+ self.cmd = server.RemoveFloatingIP(self.app, self.namespace)
+ def test_server_remove_floating_ip_default(self):
+ _server = compute_fakes.FakeServer.create_one_server()
+ _floating_ip = network_fakes.FakeFloatingIP.create_one_floating_ip()
+ self.network.find_ip = mock.Mock(return_value=_floating_ip)
arglist = [
- servers[0].id,
- '1.2.3.4',
+ _server.id,
+ _floating_ip['ip'],
]
verifylist = [
- ('server', servers[0].id),
- ('ip_address', '1.2.3.4'),
+ ('server', _server.id),
+ ('ip_address', _floating_ip['ip']),
]
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
- result = self.cmd.take_action(parsed_args)
+ self.cmd.take_action(parsed_args)
- servers[0].remove_floating_ip.assert_called_once_with('1.2.3.4')
- self.assertIsNone(result)
+ attrs = {
+ 'port_id': None,
+ }
+
+ self.network.find_ip.assert_called_once_with(
+ _floating_ip['ip'],
+ ignore_missing=False,
+ )
+ self.network.update_ip.assert_called_once_with(
+ _floating_ip,
+ **attrs
+ )
class TestServerRemovePort(TestServer):
diff --git a/openstackclient/tests/unit/network/v2/fakes.py b/openstackclient/tests/unit/network/v2/fakes.py
index a77cab8..5f3a8a4 100644
--- a/openstackclient/tests/unit/network/v2/fakes.py
+++ b/openstackclient/tests/unit/network/v2/fakes.py
@@ -335,6 +335,7 @@ class FakeNetwork(object):
'name': 'network-name-' + uuid.uuid4().hex,
'status': 'ACTIVE',
'description': 'network-description-' + uuid.uuid4().hex,
+ 'mtu': '1350',
'tenant_id': 'project-id-' + uuid.uuid4().hex,
'admin_state_up': True,
'shared': False,
diff --git a/openstackclient/tests/unit/network/v2/test_network.py b/openstackclient/tests/unit/network/v2/test_network.py
index 357088f..9f4a6ac 100644
--- a/openstackclient/tests/unit/network/v2/test_network.py
+++ b/openstackclient/tests/unit/network/v2/test_network.py
@@ -64,6 +64,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
'ipv4_address_scope',
'ipv6_address_scope',
'is_default',
+ 'mtu',
'name',
'port_security_enabled',
'project_id',
@@ -87,6 +88,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
_network.ipv4_address_scope_id,
_network.ipv6_address_scope_id,
_network.is_default,
+ _network.mtu,
_network.name,
_network.is_port_security_enabled,
_network.project_id,
@@ -149,6 +151,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
"--disable",
"--share",
"--description", self._network.description,
+ "--mtu", self._network.mtu,
"--project", self.project.name,
"--project-domain", self.domain.name,
"--availability-zone-hint", "nova",
@@ -165,6 +168,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
('disable', True),
('share', True),
('description', self._network.description),
+ ('mtu', self._network.mtu),
('project', self.project.name),
('project_domain', self.domain.name),
('availability_zone_hints', ["nova"]),
@@ -188,6 +192,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
'name': self._network.name,
'shared': True,
'description': self._network.description,
+ 'mtu': self._network.mtu,
# TODO(dtroyer): Remove tenant_id when we clean up the SDK refactor
'tenant_id': self.project.id,
'project_id': self.project.id,
@@ -286,6 +291,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
'ipv4_address_scope',
'ipv6_address_scope',
'is_default',
+ 'mtu',
'name',
'port_security_enabled',
'project_id',
@@ -309,6 +315,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
_network.ipv4_address_scope_id,
_network.ipv6_address_scope_id,
_network.is_default,
+ _network.mtu,
_network.name,
_network.is_port_security_enabled,
_network.project_id,
@@ -1023,6 +1030,7 @@ class TestShowNetwork(TestNetwork):
'ipv4_address_scope',
'ipv6_address_scope',
'is_default',
+ 'mtu',
'name',
'port_security_enabled',
'project_id',
@@ -1046,6 +1054,7 @@ class TestShowNetwork(TestNetwork):
_network.ipv4_address_scope_id,
_network.ipv6_address_scope_id,
_network.is_default,
+ _network.mtu,
_network.name,
_network.is_port_security_enabled,
_network.project_id,
diff --git a/python_openstackclient.egg-info/PKG-INFO b/python_openstackclient.egg-info/PKG-INFO
index 896b10e..dc6f734 100644
--- a/python_openstackclient.egg-info/PKG-INFO
+++ b/python_openstackclient.egg-info/PKG-INFO
@@ -1,12 +1,11 @@
Metadata-Version: 1.1
Name: python-openstackclient
-Version: 3.14.0
+Version: 3.14.2
Summary: OpenStack Command-line Client
Home-page: https://docs.openstack.org/python-openstackclient/latest/
Author: OpenStack
Author-email: openstack-dev@lists.openstack.org
License: UNKNOWN
-Description-Content-Type: UNKNOWN
Description: ========================
Team and repository tags
========================
diff --git a/python_openstackclient.egg-info/SOURCES.txt b/python_openstackclient.egg-info/SOURCES.txt
index 6cabe44..dd7e1e7 100644
--- a/python_openstackclient.egg-info/SOURCES.txt
+++ b/python_openstackclient.egg-info/SOURCES.txt
@@ -882,6 +882,7 @@ releasenotes/notes/modify-compute-agent-set-77ff894ef62ebbc7.yaml
releasenotes/notes/network-add-qos-policy-a25e868e67142f90.yaml
releasenotes/notes/network-flavor-command-support-afe3a9da962a09bf.yaml
releasenotes/notes/neutron-client-flavors-81387171f67a3c82.yaml
+releasenotes/notes/neutron_mtu-d87e53e2d76f8612.yaml
releasenotes/notes/no-project-usage-list-e88eb49aa2e96cf7.yaml
releasenotes/notes/object-stdout-db76cc500948b0e8.yaml
releasenotes/notes/recursive-container-delete-983361aa9c35ffed.yaml
diff --git a/python_openstackclient.egg-info/pbr.json b/python_openstackclient.egg-info/pbr.json
index 805ad31..af3ee01 100644
--- a/python_openstackclient.egg-info/pbr.json
+++ b/python_openstackclient.egg-info/pbr.json
@@ -1 +1 @@
-{"git_version": "fbee4eb", "is_release": true} \ No newline at end of file
+{"git_version": "6c8967d", "is_release": true} \ No newline at end of file
diff --git a/releasenotes/notes/neutron_mtu-d87e53e2d76f8612.yaml b/releasenotes/notes/neutron_mtu-d87e53e2d76f8612.yaml
new file mode 100644
index 0000000..8fadb6a
--- /dev/null
+++ b/releasenotes/notes/neutron_mtu-d87e53e2d76f8612.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ Add ``--mtu`` option to ``network create`` and ``network set``
+ commands, allowing CLI users to set the MTU for Neutron networks.
diff --git a/test-requirements.txt b/test-requirements.txt
index b1ef7d6..a049579 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -26,10 +26,10 @@ python-barbicanclient!=4.5.0,!=4.5.1,>=4.0.0 # Apache-2.0
python-congressclient<2000,>=1.9.0 # Apache-2.0
python-designateclient>=2.7.0 # Apache-2.0
python-heatclient>=1.10.0 # Apache-2.0
-python-ironicclient>=1.14.0 # Apache-2.0
+python-ironicclient>=2.2.0 # Apache-2.0
python-ironic-inspector-client>=1.5.0 # Apache-2.0
python-karborclient>=0.6.0 # Apache-2.0
-python-mistralclient>=3.1.0 # Apache-2.0
+python-mistralclient!=3.2.0,>=3.1.0 # Apache-2.0
python-muranoclient>=0.8.2 # Apache-2.0
python-neutronclient>=6.3.0 # Apache-2.0
python-octaviaclient>=1.3.0 # Apache-2.0
diff --git a/tox.ini b/tox.ini
index 47b745a..bfb768d 100644
--- a/tox.ini
+++ b/tox.ini
@@ -11,7 +11,7 @@ setenv = VIRTUAL_ENV={envdir}
OS_STDERR_CAPTURE=1
OS_TEST_TIMEOUT=60
deps =
- -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+ -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/queens}
-r{toxinidir}/test-requirements.txt
-r{toxinidir}/requirements.txt
commands = stestr run {posargs}
@@ -106,14 +106,14 @@ commands =
[testenv:docs]
deps =
- -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+ -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/queens}
-r{toxinidir}/requirements.txt
-r{toxinidir}/doc/requirements.txt
commands = python setup.py build_sphinx
[testenv:releasenotes]
deps =
- -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt}
+ -c{env:UPPER_CONSTRAINTS_FILE:https://git.openstack.org/cgit/openstack/requirements/plain/upper-constraints.txt?h=stable/queens}
-r{toxinidir}/requirements.txt
-r{toxinidir}/doc/requirements.txt
commands =