Hello community,
here is the log from the commit of package python-cinderclient for openSUSE:Factory checked in at 2019-05-03 22:40:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-cinderclient (Old)
and /work/SRC/openSUSE:Factory/.python-cinderclient.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-cinderclient"
Fri May 3 22:40:03 2019 rev:34 rq:692818 version:4.1.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-cinderclient/python-cinderclient.changes 2018-09-07 15:36:58.238693500 +0200
+++ /work/SRC/openSUSE:Factory/.python-cinderclient.new.5148/python-cinderclient.changes 2019-05-03 22:40:13.210962756 +0200
@@ -1,0 +2,21 @@
+Mon Apr 8 12:32:35 UTC 2019 - cloud-devel@suse.de
+
+- update to version 4.1.0
+ - refactor the getid method base.py
+ - Fix functional error check for invalid volume create size
+ - [Optimize] Update help text for hint argument
+ - Fix backwards compat for volume transfer < 3.55
+ - add lib-forward-testing-python3 test job
+ - Default help output to include MV updates
+ - update wrong link
+ - Fix encoding of query parameters
+ - Update reno for stable/rocky
+ - __repr__ crashes when empty dict passed
+ - Fix endpoint identification for api-version query
+ - switch documentation job to new PTI
+ - [Trivial] Add backup-id to 'size' param info
+ - add python 3.6 unit test job
+ - import zuul job settings from project-config
+ - Use templates for cover and lower-constraints
+
+-------------------------------------------------------------------
Old:
----
python-cinderclient-4.0.1.tar.gz
New:
----
python-cinderclient-4.1.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-cinderclient.spec ++++++
--- /var/tmp/diff_new_pack.EEzVvl/_old 2019-05-03 22:40:15.458967489 +0200
+++ /var/tmp/diff_new_pack.EEzVvl/_new 2019-05-03 22:40:15.486967548 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-cinderclient
#
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,18 +12,18 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: python-cinderclient
-Version: 4.0.1
+Version: 4.1.0
Release: 0
Summary: Python API and CLI for OpenStack Cinder
License: Apache-2.0
Group: Development/Languages/Python
URL: https://launchpad.net/python-cinderclient
-Source0: https://files.pythonhosted.org/packages/source/p/python-cinderclient/python-...
+Source0: https://files.pythonhosted.org/packages/source/p/python-cinderclient/python-...
BuildRequires: openstack-macros
BuildRequires: python-devel
BuildRequires: python2-PrettyTable >= 0.7.1
@@ -31,14 +31,13 @@
BuildRequires: python2-fixtures
BuildRequires: python2-keystoneauth1 >= 3.4.0
BuildRequires: python2-mock
-BuildRequires: python2-os-testr
BuildRequires: python2-oslo.serialization
BuildRequires: python2-oslo.utils >= 3.33.0
BuildRequires: python2-pbr >= 2.0.0
BuildRequires: python2-python-subunit
-BuildRequires: python2-requests
+BuildRequires: python2-requests >= 2.14.2
BuildRequires: python2-requests-mock
-BuildRequires: python2-testrepository
+BuildRequires: python2-stestr
BuildRequires: python2-testscenarios
BuildRequires: python2-testtools
BuildRequires: python3-PrettyTable >= 0.7.1
@@ -47,14 +46,13 @@
BuildRequires: python3-fixtures
BuildRequires: python3-keystoneauth1 >= 3.4.0
BuildRequires: python3-mock
-BuildRequires: python3-os-testr
BuildRequires: python3-oslo.serialization
BuildRequires: python3-oslo.utils >= 3.33.0
BuildRequires: python3-pbr >= 2.0.0
BuildRequires: python3-python-subunit
-BuildRequires: python3-requests
+BuildRequires: python3-requests >= 2.14.2
BuildRequires: python3-requests-mock
-BuildRequires: python3-testrepository
+BuildRequires: python3-stestr
BuildRequires: python3-testscenarios
BuildRequires: python3-testtools
Requires: python-Babel >= 2.3.4
@@ -62,7 +60,7 @@
Requires: python-keystoneauth1 >= 3.4.0
Requires: python-oslo.i18n >= 3.15.3
Requires: python-oslo.utils >= 3.33.0
-Requires: python-requests
+Requires: python-requests >= 2.14.2
Requires: python-simplejson >= 3.5.1
Requires: python-six >= 1.10.0
BuildArch: noarch
@@ -95,15 +93,14 @@
This package contains auto-generated documentation.
%prep
-%autosetup -p1 -n python-cinderclient-4.0.1
+%autosetup -p1 -n python-cinderclient-4.1.0
%py_req_cleanup
-sed -i 's/^warning-is-error.*/warning-is-error = 0/g' setup.cfg
%build
%{python_build}
-PBR_VERSION=4.0.1 sphinx-build -b html doc/source doc/build/html
-PBR_VERSION=4.0.1 sphinx-build -b man doc/source doc/build/man
+PBR_VERSION=4.1.0 sphinx-build -b html doc/source doc/build/html
+PBR_VERSION=4.1.0 sphinx-build -b man doc/source doc/build/man
# remove the sphinx-build leftovers
rm -rf doc/build/html/.{doctrees,buildinfo}
@@ -125,9 +122,7 @@
%check
rm cinderclient/tests/unit/test_shell.py
-%{python_expand rm -rf .testrepository
-ostestr
-}
+%python_exec -m stestr.cli run
%files %{python_files}
%license LICENSE
++++++ _service ++++++
--- /var/tmp/diff_new_pack.EEzVvl/_old 2019-05-03 22:40:15.890968399 +0200
+++ /var/tmp/diff_new_pack.EEzVvl/_new 2019-05-03 22:40:15.914968449 +0200
@@ -1,8 +1,8 @@
<services>
<service mode="disabled" name="renderspec">
- <param name="input-template">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/rocky/opens...</param>
+ <param name="input-template">https://raw.githubusercontent.com/openstack/rpm-packaging/stable/stein/opens...</param>
<param name="output-name">python-cinderclient.spec</param>
- <param name="requirements">https://raw.githubusercontent.com/openstack/python-cinderclient/stable/rocky...</param>
+ <param name="requirements">https://raw.githubusercontent.com/openstack/python-cinderclient/stable/stein...</param>
<param name="changelog-email">cloud-devel@suse.de</param>
<param name="changelog-provider">gh,openstack,python-cinderclient</param>
</service>
++++++ python-cinderclient-4.0.1.tar.gz -> python-cinderclient-4.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/.zuul.yaml new/python-cinderclient-4.1.0/.zuul.yaml
--- old/python-cinderclient-4.0.1/.zuul.yaml 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/.zuul.yaml 2018-10-08 20:03:35.000000000 +0200
@@ -24,11 +24,20 @@
- project:
+ templates:
+ - check-requirements
+ - lib-forward-testing
+ - lib-forward-testing-python3
+ - openstack-cover-jobs
+ - openstack-lower-constraints-jobs
+ - openstack-python-jobs
+ - openstack-python35-jobs
+ - openstack-python36-jobs
+ - publish-openstack-docs-pti
+ - release-notes-jobs-python3
check:
jobs:
- cinderclient-dsvm-functional
- cinderclient-dsvm-functional-identity-v3-only
- - openstack-tox-lower-constraints
- gate:
- jobs:
- - openstack-tox-lower-constraints
+ - openstack-tox-pylint:
+ voting: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/AUTHORS new/python-cinderclient-4.1.0/AUTHORS
--- old/python-cinderclient-4.0.1/AUTHORS 2018-08-01 18:17:44.000000000 +0200
+++ new/python-cinderclient-4.1.0/AUTHORS 2018-10-08 20:04:26.000000000 +0200
@@ -76,6 +76,7 @@
Gerhard Muntingh
Gloria Gu
Gorka Eguileor
+Goutham Pacha Ravi
Gábor Antal
Haneef Ali
Hangdong Zhang
@@ -222,7 +223,6 @@
ZhiQiang Fan
Zhiteng Huang
Zhiteng Huang
-Zuul
abhishekkekane
alex
bhagyashris
@@ -288,6 +288,8 @@
wanghao
wanghao
wangxiyuan
+whoami-rajat
+wu.chunyang
xianming mao
xiexs
xing-yang
@@ -303,4 +305,5 @@
zheng yin
zhengyin
zhu.rong
+zhubx007
zwei
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/ChangeLog new/python-cinderclient-4.1.0/ChangeLog
--- old/python-cinderclient-4.0.1/ChangeLog 2018-08-01 18:17:44.000000000 +0200
+++ new/python-cinderclient-4.1.0/ChangeLog 2018-10-08 20:04:26.000000000 +0200
@@ -1,6 +1,25 @@
CHANGES
=======
+4.1.0
+-----
+
+* Default help output to include MV updates
+* [Trivial] Add backup-id to 'size' param info
+* Fix encoding of query parameters
+* Fix functional error check for invalid volume create size
+* Use templates for cover and lower-constraints
+* add lib-forward-testing-python3 test job
+* add python 3.6 unit test job
+* switch documentation job to new PTI
+* import zuul job settings from project-config
+* \_\_repr\_\_ crashes when empty dict passed
+* Update reno for stable/rocky
+* refactor the getid method base.py
+* Fix endpoint identification for api-version query
+* Fix backwards compat for volume transfer < 3.55
+* update wrong link
+
4.0.1
-----
@@ -19,6 +38,7 @@
* Transfer snapshots with volumes
* Add release note for ability to set attachment mode
* fix tox python3 overrides
+* [Optimize] Update help text for hint argument
* Add mode option to attachment-create
* Remove initialization of logger if logger is None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/PKG-INFO new/python-cinderclient-4.1.0/PKG-INFO
--- old/python-cinderclient-4.0.1/PKG-INFO 2018-08-01 18:17:47.000000000 +0200
+++ new/python-cinderclient-4.1.0/PKG-INFO 2018-10-08 20:04:27.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-cinderclient
-Version: 4.0.1
+Version: 4.1.0
Summary: OpenStack Block Storage API Client Library
Home-page: https://docs.openstack.org/python-cinderclient/latest/
Author: OpenStack
@@ -44,7 +44,7 @@
for the Rackspace API solely or the BSD license, you should use that repository.
python-cinderclient is licensed under the Apache License like the rest of OpenStack.
- __ https://github.com/jacobian-archive/python-cloudservers
+ __ https://github.com/rackerlabs/python-cloudservers
* License: Apache License, Version 2.0
* `PyPi`_ - package installation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/README.rst new/python-cinderclient-4.1.0/README.rst
--- old/python-cinderclient-4.0.1/README.rst 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/README.rst 2018-10-08 20:03:35.000000000 +0200
@@ -36,7 +36,7 @@
for the Rackspace API solely or the BSD license, you should use that repository.
python-cinderclient is licensed under the Apache License like the rest of OpenStack.
-__ https://github.com/jacobian-archive/python-cloudservers
+__ https://github.com/rackerlabs/python-cloudservers
* License: Apache License, Version 2.0
* `PyPi`_ - package installation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/RELEASENOTES.rst new/python-cinderclient-4.1.0/RELEASENOTES.rst
--- old/python-cinderclient-4.0.1/RELEASENOTES.rst 2018-08-01 18:17:46.000000000 +0200
+++ new/python-cinderclient-4.1.0/RELEASENOTES.rst 1970-01-01 01:00:00.000000000 +0100
@@ -1,92 +0,0 @@
-===================
-python-cinderclient
-===================
-
-.. _python-cinderclient_4.0.1:
-
-4.0.1
-=====
-
-.. _python-cinderclient_4.0.1_Bug Fixes:
-
-Bug Fixes
----------
-
-.. releasenotes/notes/volume-transfer-bug-23c760efb9f98a4d.yaml @ b'460229c6099719dec0d027f798f9c751b8ec7e44'
-
-- An issue was discovered with the way API microversions were handled for the
- new volume-transfer with snapshot handling with microversion 3.55. This
- release includes a fix to keep backwards compatibility with earlier
- releases. See `bug #1784703
- https://bugs.launchpad.net/cinder/+bug/1784703`_ for more details.
-
-
-.. _python-cinderclient_4.0.0:
-
-4.0.0
-=====
-
-.. _python-cinderclient_4.0.0_New Features:
-
-New Features
-------------
-
-.. releasenotes/notes/attachment-mode-8427aa6a2fa26e70.yaml @ b'826c5fc16d6f572cf544e3f0a91330bf92701c69'
-
-- Added the ability to specify the read-write or read-only mode of an
- attachment starting with microversion 3.54. The command line usage is
- `cinder attachment-create --mode [rw|ro]`.
-
-.. releasenotes/notes/transfer-snapshots-555c61477835bcf7.yaml @ b'a554faa6530fa0bb70430572869a6a2555783912'
-
-- Starting with microversion 3.55, the volume transfer command now has the
- ability to exclude a volume's snapshots when transferring a volume to another
- project. The new command format is `cinder transfer-create --no-snapshots`.
-
-
-.. _python-cinderclient_4.0.0_Upgrade Notes:
-
-Upgrade Notes
--------------
-
-.. releasenotes/notes/remove-deprecations-621919062f867015.yaml @ b'a331f06df0158fff28162eabc765f164855afcee'
-
-- The following CLI options were deprecated for one or more releases and have
- now been removed:
-
- ``--endpoint-type``
- This option has been replaced by ``--os-endpoint-type``.
-
- ``--bypass-url``
- This option has been replaced by ``--os-endpoint``.
-
- ``--os-auth-system``
- This option has been replaced by ``--os-auth-type``.
-
-.. releasenotes/notes/remove-replv1-cabf2194edb9d963.yaml @ b'32251f0ea3863098b4d4d54364c8ee18ff170a44'
-
-- The volume creation argument ``--source-replica`` on the command line and
- the ``source_replica`` kwarg for the ``create()`` call when using the
- cinderclient library were for the replication v1 support that was removed
- in the Mitaka release. These options have now been removed.
-
-
-.. _python-cinderclient_3.6.0:
-
-3.6.0
-=====
-
-.. _python-cinderclient_3.6.0_New Features:
-
-New Features
-------------
-
-.. releasenotes/notes/feature-cross-az-backups-9d428ad4dfc552e1.yaml @ b'2c774cc015cb6624fe37823b586864c63525c379'
-
-- Support cross AZ backup creation specifying desired backup service AZ
- (added in microversion v3.51)
-
-.. releasenotes/notes/support-filter-type-7yt69ub7ccbf7419.yaml @ b'5a1513244caf7acbd41e181419bc8b62bf4bcaba'
-
-- New command option ``--filters`` is added to ``type-list`` command to support filter types since 3.52, and it's only valid for administrator.
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/apiclient/base.py new/python-cinderclient-4.1.0/cinderclient/apiclient/base.py
--- old/python-cinderclient-4.0.1/cinderclient/apiclient/base.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/apiclient/base.py 2018-10-08 20:03:35.000000000 +0200
@@ -28,9 +28,9 @@
from requests import Response
import six
-from six.moves.urllib import parse
from cinderclient.apiclient import exceptions
+from cinderclient import utils
from oslo_utils import encodeutils
from oslo_utils import strutils
@@ -41,15 +41,10 @@
Abstracts the common pattern of allowing both an object or an object's ID
(UUID) as a parameter when dealing with relationships.
"""
- try:
- if obj.uuid:
- return obj.uuid
- except AttributeError:
- pass
- try:
- return obj.id
- except AttributeError:
- return obj
+ if getattr(obj, 'uuid', None):
+ return obj.uuid
+ else:
+ return getattr(obj, 'id', obj)
# TODO(aababilov): call run_hooks() in HookableMixin's child classes
@@ -330,7 +325,7 @@
return self._list(
'%(base_url)s%(query)s' % {
'base_url': self.build_url(base_url=base_url, **kwargs),
- 'query': '?%s' % parse.urlencode(kwargs) if kwargs else '',
+ 'query': utils.build_query_param(kwargs),
},
self.collection_key)
@@ -369,7 +364,7 @@
rl = self._list(
'%(base_url)s%(query)s' % {
'base_url': self.build_url(base_url=base_url, **kwargs),
- 'query': '?%s' % parse.urlencode(kwargs) if kwargs else '',
+ 'query': '?%s' % utils.build_query_param(kwargs),
},
self.collection_key)
num = len(rl)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/base.py new/python-cinderclient-4.1.0/cinderclient/base.py
--- old/python-cinderclient-4.0.1/cinderclient/base.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/base.py 2018-10-08 20:03:35.000000000 +0200
@@ -24,7 +24,6 @@
import os
import six
-from six.moves.urllib import parse
from cinderclient.apiclient import base as common_base
from cinderclient import exceptions
@@ -53,10 +52,7 @@
Abstracts the common pattern of allowing both an object or an object's ID
as a parameter when dealing with relationships.
"""
- try:
- return obj.id
- except AttributeError:
- return obj
+ return getattr(obj, 'id', obj)
class Manager(common_base.HookableMixin):
@@ -173,10 +169,8 @@
query_params = utils.unicode_key_value_to_string(query_params)
# Transform the dict to a sequence of two-element tuples in fixed
# order, then the encoded string will be consistent in Python 2&3.
- query_string = ""
- if query_params:
- params = sorted(query_params.items(), key=lambda x: x[0])
- query_string = "?%s" % parse.urlencode(params)
+
+ query_string = utils.build_query_param(query_params, sort=True)
detail = ""
if detailed:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/client.py new/python-cinderclient-4.1.0/cinderclient/client.py
--- old/python-cinderclient-4.0.1/cinderclient/client.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/client.py 2018-10-08 20:03:35.000000000 +0200
@@ -210,7 +210,13 @@
def _get_base_url(self):
endpoint = self.get_endpoint()
- base_url = '/'.join(endpoint.split('/')[:3]) + '/'
+ m = re.search('(.+)/v[1-3].*', endpoint)
+ if m:
+ # Get everything up until the version identifier
+ base_url = '%s/' % m.group(1)
+ else:
+ # Fall back to the root of the URL
+ base_url = '/'.join(endpoint.split('/')[:3]) + '/'
return base_url
def get_volume_api_version_from_endpoint(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/shell.py new/python-cinderclient-4.1.0/cinderclient/shell.py
--- old/python-cinderclient-4.0.1/cinderclient/shell.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/shell.py 2018-10-08 20:03:35.000000000 +0200
@@ -51,7 +51,6 @@
_i18n.enable_lazy()
-DEFAULT_MAJOR_OS_VOLUME_API_VERSION = "3"
DEFAULT_CINDER_ENDPOINT_TYPE = 'publicURL'
V1_SHELL = 'cinderclient.v1.shell'
V2_SHELL = 'cinderclient.v2.shell'
@@ -534,7 +533,7 @@
if not options.os_volume_api_version:
api_version = api_versions.get_api_version(
- DEFAULT_MAJOR_OS_VOLUME_API_VERSION)
+ api_versions.MAX_VERSION)
else:
api_version = api_versions.get_api_version(
options.os_volume_api_version)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/functional/test_volume_create_cli.py new/python-cinderclient-4.1.0/cinderclient/tests/functional/test_volume_create_cli.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/functional/test_volume_create_cli.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/functional/test_volume_create_cli.py 2018-10-08 20:03:35.000000000 +0200
@@ -26,8 +26,8 @@
@ddt.data(
('', (r'Size is a required parameter')),
- ('-1', (r'Invalid volume size provided for create request')),
- ('0', (r"Volume size '0' must be an integer and greater than 0")),
+ ('-1', (r'Invalid input for field/attribute size')),
+ ('0', (r"Invalid input for field/attribute size")),
('size', (r'invalid int value')),
('0.2', (r'invalid int value')),
('2 GB', (r'unrecognized arguments')),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/test_client.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/test_client.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/test_client.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/test_client.py 2018-10-08 20:03:35.000000000 +0200
@@ -32,6 +32,7 @@
from cinderclient.tests.unit.v3 import fakes
+@ddt.ddt
class ClientTest(utils.TestCase):
def test_get_client_class_v1(self):
@@ -99,11 +100,21 @@
unknown_url)
@mock.patch('cinderclient.client.SessionClient.get_endpoint')
- def test_get_base_url(self, mock_get_endpoint):
- url = 'http://192.168.122.104:8776/v3/de50d1f33a38415fadfd3e1dea28f4d3'
+ @ddt.data(
+ ('http://192.168.1.1:8776/v2', 'http://192.168.1.1:8776/'),
+ ('http://192.168.1.1:8776/v3/e5526285ebd741b1819393f772f11fc3',
+ 'http://192.168.1.1:8776/'),
+ ('https://192.168.1.1:8080/volumes/v3/'
+ 'e5526285ebd741b1819393f772f11fc3',
+ 'https://192.168.1.1:8080/volumes/'),
+ ('http://192.168.1.1/volumes/v3/e5526285ebd741b1819393f772f11fc3',
+ 'http://192.168.1.1/volumes/'),
+ ('https://volume.example.com/', 'https://volume.example.com/'))
+ @ddt.unpack
+ def test_get_base_url(self, url, expected_base, mock_get_endpoint):
mock_get_endpoint.return_value = url
cs = cinderclient.client.SessionClient(self, api_version='3.0')
- self.assertEqual('http://192.168.122.104:8776/', cs._get_base_url())
+ self.assertEqual(expected_base, cs._get_base_url())
@mock.patch.object(adapter.Adapter, 'request')
@mock.patch.object(exceptions, 'from_response')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/test_utils.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/test_utils.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/test_utils.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/test_utils.py 2018-10-08 20:03:35.000000000 +0200
@@ -162,6 +162,7 @@
self.read = self.stringio.read
+@ddt.ddt
class BuildQueryParamTestCase(test_utils.TestCase):
def test_build_param_without_sort_switch(self):
@@ -187,19 +188,17 @@
expected = "?key1=val1&key2=val2&key3=val3"
self.assertEqual(expected, result)
- def test_build_param_with_none(self):
- dict_param = {
- 'key1': 'val1',
- 'key2': None,
- 'key3': False,
- 'key4': ''
- }
- result_1 = utils.build_query_param(dict_param)
- result_2 = utils.build_query_param(None)
-
- expected = "?key1=val1"
- self.assertEqual(expected, result_1)
- self.assertFalse(result_2)
+ @ddt.data({},
+ None,
+ {'key1': 'val1', 'key2': None, 'key3': False, 'key4': ''})
+ def test_build_param_with_nones(self, dict_param):
+ result = utils.build_query_param(dict_param)
+
+ expected = ("key1=val1", "key3=False") if dict_param else ()
+ for exp in expected:
+ self.assertIn(exp, result)
+ if not expected:
+ self.assertEqual("", result)
@ddt.ddt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/v1/test_shell.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/v1/test_shell.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/v1/test_shell.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/v1/test_shell.py 2018-10-08 20:03:35.000000000 +0200
@@ -101,7 +101,7 @@
def test_list(self):
self.run_command('list')
# NOTE(jdg): we default to detail currently
- self.assert_called('GET', '/volumes/detail')
+ self.assert_called('GET', '/volumes/detail?all_tenants=0')
def test_list_filter_tenant_with_all_tenants(self):
self.run_command('list --tenant=123 --all-tenants 1')
@@ -184,11 +184,13 @@
def test_list_filter_status(self):
self.run_command('list --status=available')
- self.assert_called('GET', '/volumes/detail?status=available')
+ self.assert_called('GET',
+ '/volumes/detail?all_tenants=0&status=available')
def test_list_filter_display_name(self):
self.run_command('list --display-name=1234')
- self.assert_called('GET', '/volumes/detail?display_name=1234')
+ self.assert_called('GET',
+ '/volumes/detail?all_tenants=0&display_name=1234')
def test_list_all_tenants(self):
self.run_command('list --all-tenants=1')
@@ -200,7 +202,7 @@
def test_list_limit(self):
self.run_command('list --limit=10')
- self.assert_called('GET', '/volumes/detail?limit=10')
+ self.assert_called('GET', '/volumes/detail?all_tenants=0&limit=10')
def test_show(self):
self.run_command('show 1234')
@@ -231,12 +233,13 @@
def test_snapshot_list_filter_volume_id(self):
self.run_command('snapshot-list --volume-id=1234')
- self.assert_called('GET', '/snapshots/detail?volume_id=1234')
+ self.assert_called('GET',
+ '/snapshots/detail?all_tenants=0&volume_id=1234')
def test_snapshot_list_filter_status_and_volume_id(self):
self.run_command('snapshot-list --status=available --volume-id=1234')
self.assert_called('GET', '/snapshots/detail?'
- 'status=available&volume_id=1234')
+ 'all_tenants=0&status=available&volume_id=1234')
def test_rename(self):
# basic rename with positional arguments
@@ -483,7 +486,7 @@
def test_list_transfer(self):
self.run_command('transfer-list')
- self.assert_called('GET', '/os-volume-transfer/detail')
+ self.assert_called('GET', '/os-volume-transfer/detail?all_tenants=0')
def test_list_transfer_all_tenants(self):
self.run_command('transfer-list --all-tenants=1')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/v2/test_capabilities.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/v2/test_capabilities.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/v2/test_capabilities.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/v2/test_capabilities.py 2018-10-08 20:03:35.000000000 +0200
@@ -53,3 +53,8 @@
cap = Capabilities(None, FAKE_CAPABILITY)
self.assertEqual(
"" % FAKE_CAPABILITY['namespace'], repr(cap))
+
+ def test__repr__when_empty(self):
+ cap = Capabilities(None, {})
+ self.assertEqual(
+ "", repr(cap))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/v2/test_shell.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/v2/test_shell.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/v2/test_shell.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/v2/test_shell.py 2018-10-08 20:03:35.000000000 +0200
@@ -1176,7 +1176,7 @@
def test_list_transfer(self):
self.run_command('transfer-list')
- self.assert_called('GET', '/os-volume-transfer/detail')
+ self.assert_called('GET', '/os-volume-transfer/detail?all_tenants=0')
def test_list_transfer_all_tenants(self):
self.run_command('transfer-list --all-tenants=1')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/v3/test_shell.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/v3/test_shell.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/v3/test_shell.py 2018-08-01 18:15:51.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/v3/test_shell.py 2018-10-08 20:03:35.000000000 +0200
@@ -131,37 +131,37 @@
{'command':
'list --filters name~=456',
'expected':
- '/volumes/detail?name%7E=456'},
+ '/volumes/detail?name~=456'},
{'command':
u'list --filters name~=Σ',
'expected':
- '/volumes/detail?name%7E=%CE%A3'},
+ '/volumes/detail?name~=%CE%A3'},
# testcases for list group
{'command':
'group-list --filters name=456',
'expected':
- '/groups/detail?name=456'},
+ '/groups/detail?all_tenants=0&name=456'},
{'command':
'group-list --filters status=available',
'expected':
- '/groups/detail?status=available'},
+ '/groups/detail?all_tenants=0&status=available'},
{'command':
'group-list --filters name~=456',
'expected':
- '/groups/detail?name%7E=456'},
+ '/groups/detail?all_tenants=0&name~=456'},
# testcases for list group-snapshot
{'command':
'group-snapshot-list --status=error --filters status=available',
'expected':
- '/group_snapshots/detail?status=available'},
+ '/group_snapshots/detail?all_tenants=0&status=available'},
{'command':
'group-snapshot-list --filters availability_zone=123',
'expected':
- '/group_snapshots/detail?availability_zone=123'},
+ '/group_snapshots/detail?all_tenants=0&availability_zone=123'},
{'command':
'group-snapshot-list --filters status~=available',
'expected':
- '/group_snapshots/detail?status%7E=available'},
+ '/group_snapshots/detail?all_tenants=0&status~=available'},
# testcases for list message
{'command':
'message-list --event_id=123 --filters event_id=456',
@@ -174,7 +174,7 @@
{'command':
'message-list --filters request_id~=123',
'expected':
- '/messages?request_id%7E=123'},
+ '/messages?request_id~=123'},
# testcases for list attachment
{'command':
'attachment-list --volume-id=123 --filters volume_id=456',
@@ -187,7 +187,7 @@
{'command':
'attachment-list --filters volume_id~=456',
'expected':
- '/attachments?volume_id%7E=456'},
+ '/attachments?volume_id~=456'},
# testcases for list backup
{'command':
'backup-list --volume-id=123 --filters volume_id=456',
@@ -200,7 +200,7 @@
{'command':
'backup-list --filters volume_id~=456',
'expected':
- '/backups/detail?volume_id%7E=456'},
+ '/backups/detail?volume_id~=456'},
# testcases for list snapshot
{'command':
'snapshot-list --volume-id=123 --filters volume_id=456',
@@ -213,7 +213,7 @@
{'command':
'snapshot-list --filters volume_id~=456',
'expected':
- '/snapshots/detail?volume_id%7E=456'},
+ '/snapshots/detail?volume_id~=456'},
# testcases for get pools
{'command':
'get-pools --filters name=456 --detail',
@@ -632,7 +632,7 @@
def test_group_list(self):
self.run_command('--os-volume-api-version 3.13 group-list')
- self.assert_called_anytime('GET', '/groups/detail')
+ self.assert_called_anytime('GET', '/groups/detail?all_tenants=0')
def test_group_list__with_all_tenant(self):
self.run_command(
@@ -691,7 +691,8 @@
def test_group_snapshot_list(self):
self.run_command('--os-volume-api-version 3.14 group-snapshot-list')
- self.assert_called_anytime('GET', '/group_snapshots/detail')
+ self.assert_called_anytime('GET',
+ '/group_snapshots/detail?all_tenants=0')
def test_group_snapshot_show(self):
self.run_command('--os-volume-api-version 3.14 '
@@ -1338,7 +1339,7 @@
expected = {'transfer': {'volume_id': 1234,
'name': None,
}}
- self.assert_called('POST', '/volume-transfers', body=expected)
+ self.assert_called('POST', '/os-volume-transfer', body=expected)
def test_create_transfer_no_snaps(self):
self.run_command('--os-volume-api-version 3.55 transfer-create '
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/tests/unit/v3/test_volume_transfers.py new/python-cinderclient-4.1.0/cinderclient/tests/unit/v3/test_volume_transfers.py
--- old/python-cinderclient-4.0.1/cinderclient/tests/unit/v3/test_volume_transfers.py 2018-08-01 18:15:51.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/tests/unit/v3/test_volume_transfers.py 2018-10-08 20:03:35.000000000 +0200
@@ -17,55 +17,93 @@
from cinderclient.tests.unit import utils
from cinderclient.tests.unit.v3 import fakes
+TRANSFER_URL = 'os-volume-transfer'
+TRANSFER_355_URL = 'volume-transfers'
# Create calls need the right version of faked client
-v3cs = fakes.FakeClient(api_versions.APIVersion('3.55'))
-# Other calls fall back to default behavior
-cs = fakes.FakeClient()
+v355cs = fakes.FakeClient(api_versions.APIVersion('3.55'))
+# Other calls fall back to API extension behavior
+v3cs = fakes.FakeClient(api_versions.APIVersion('3.0'))
class VolumeTransfersTest(utils.TestCase):
def test_create(self):
vol = v3cs.transfers.create('1234')
- v3cs.assert_called('POST', '/volume-transfers',
- body={'transfer': {'volume_id': '1234', 'name': None,
- 'no_snapshots': False}})
+ v3cs.assert_called('POST', '/%s' % TRANSFER_URL,
+ body={'transfer': {'volume_id': '1234',
+ 'name': None}})
+ self._assert_request_id(vol)
+
+ def test_create_355(self):
+ vol = v355cs.transfers.create('1234')
+ v355cs.assert_called('POST', '/%s' % TRANSFER_355_URL,
+ body={'transfer': {'volume_id': '1234',
+ 'name': None,
+ 'no_snapshots': False}})
self._assert_request_id(vol)
def test_create_without_snapshots(self):
- vol = v3cs.transfers.create('1234', no_snapshots=True)
- v3cs.assert_called('POST', '/volume-transfers',
- body={'transfer': {'volume_id': '1234', 'name': None,
- 'no_snapshots': True}})
+ vol = v355cs.transfers.create('1234', no_snapshots=True)
+ v355cs.assert_called('POST', '/%s' % TRANSFER_355_URL,
+ body={'transfer': {'volume_id': '1234',
+ 'name': None,
+ 'no_snapshots': True}})
self._assert_request_id(vol)
- def test_get(self):
+ def _test_get(self, client, expected_url):
transfer_id = '5678'
- vol = cs.transfers.get(transfer_id)
- cs.assert_called('GET', '/os-volume-transfer/%s' % transfer_id)
+ vol = client.transfers.get(transfer_id)
+ client.assert_called('GET', '/%s/%s' % (expected_url, transfer_id))
self._assert_request_id(vol)
- def test_list(self):
- lst = cs.transfers.list()
- cs.assert_called('GET', '/os-volume-transfer/detail')
+ def test_get(self):
+ self._test_get(v3cs, TRANSFER_URL)
+
+ def test_get_355(self):
+ self._test_get(v355cs, TRANSFER_355_URL)
+
+ def _test_list(self, client, expected_url):
+ lst = client.transfers.list()
+ client.assert_called('GET', '/%s/detail' % expected_url)
self._assert_request_id(lst)
- def test_delete(self):
- b = cs.transfers.list()[0]
+ def test_list(self):
+ self._test_list(v3cs, TRANSFER_URL)
+
+ def test_list_355(self):
+ self._test_list(v355cs, TRANSFER_355_URL)
+
+ def _test_delete(self, client, expected_url):
+ url = '/%s/5678' % expected_url
+ b = client.transfers.list()[0]
vol = b.delete()
- cs.assert_called('DELETE', '/os-volume-transfer/5678')
+ client.assert_called('DELETE', url)
self._assert_request_id(vol)
- vol = cs.transfers.delete('5678')
+ vol = client.transfers.delete('5678')
self._assert_request_id(vol)
- cs.assert_called('DELETE', '/os-volume-transfer/5678')
- vol = cs.transfers.delete(b)
- cs.assert_called('DELETE', '/os-volume-transfer/5678')
+ client.assert_called('DELETE', url)
+ vol = client.transfers.delete(b)
+ client.assert_called('DELETE', url)
self._assert_request_id(vol)
- def test_accept(self):
+ def test_delete(self):
+ self._test_delete(v3cs, TRANSFER_URL)
+
+ def test_delete_355(self):
+ self._test_delete(v355cs, TRANSFER_355_URL)
+
+ def _test_accept(self, client, expected_url):
transfer_id = '5678'
auth_key = '12345'
- vol = cs.transfers.accept(transfer_id, auth_key)
- cs.assert_called('POST', '/os-volume-transfer/%s/accept' % transfer_id)
+ vol = client.transfers.accept(transfer_id, auth_key)
+ client.assert_called(
+ 'POST',
+ '/%s/%s/accept' % (expected_url, transfer_id))
self._assert_request_id(vol)
+
+ def test_accept(self):
+ self._test_accept(v3cs, TRANSFER_URL)
+
+ def test_accept_355(self):
+ self._test_accept(v355cs, TRANSFER_355_URL)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/utils.py new/python-cinderclient-4.1.0/cinderclient/utils.py
--- old/python-cinderclient-4.0.1/cinderclient/utils.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/utils.py 2018-10-08 20:03:35.000000000 +0200
@@ -206,15 +206,27 @@
def build_query_param(params, sort=False):
"""parse list to url query parameters"""
- if params is None:
- params = {}
+ if not params:
+ return ""
+
if not sort:
param_list = list(params.items())
else:
param_list = list(sorted(params.items()))
query_string = parse.urlencode(
- [(k, v) for (k, v) in param_list if v])
+ [(k, v) for (k, v) in param_list if v not in (None, '')])
+
+ # urllib's parse library used to adhere to RFC 2396 until
+ # python 3.7. The library moved from RFC 2396 to RFC 3986
+ # for quoting URL strings in python 3.7 and '~' is now
+ # included in the set of reserved characters. [1]
+ #
+ # Below ensures "~" is never encoded. See LP 1784728 [2] for more details.
+ # [1] https://docs.python.org/3/library/urllib.parse.html#url-quoting
+ # [2] https://bugs.launchpad.net/python-cinderclient/+bug/1784728
+ query_string = query_string.replace("%7E=", "~=")
+
if query_string:
query_string = "?%s" % (query_string,)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v1/volume_snapshots.py new/python-cinderclient-4.1.0/cinderclient/v1/volume_snapshots.py
--- old/python-cinderclient-4.0.1/cinderclient/v1/volume_snapshots.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v1/volume_snapshots.py 2018-10-08 20:03:35.000000000 +0200
@@ -107,7 +107,7 @@
:rtype: list of :class:`Snapshot`
"""
- query_string = utils.build_query_param(search_opts, True)
+ query_string = utils.build_query_param(search_opts, sort=True)
detail = ""
if detailed:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v1/volumes.py new/python-cinderclient-4.1.0/cinderclient/v1/volumes.py
--- old/python-cinderclient-4.0.1/cinderclient/v1/volumes.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v1/volumes.py 2018-10-08 20:03:35.000000000 +0200
@@ -203,7 +203,7 @@
if limit:
search_opts['limit'] = limit
- query_string = utils.build_query_param(search_opts, True)
+ query_string = utils.build_query_param(search_opts, sort=True)
detail = ""
if detailed:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v2/capabilities.py new/python-cinderclient-4.1.0/cinderclient/v2/capabilities.py
--- old/python-cinderclient-4.0.1/cinderclient/v2/capabilities.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v2/capabilities.py 2018-10-08 20:03:35.000000000 +0200
@@ -22,7 +22,7 @@
NAME_ATTR = 'name'
def __repr__(self):
- return "" % self._info['namespace']
+ return "" % self._info.get('namespace')
class CapabilitiesManager(base.Manager):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v2/limits.py new/python-cinderclient-4.1.0/cinderclient/v2/limits.py
--- old/python-cinderclient-4.0.1/cinderclient/v2/limits.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v2/limits.py 2018-10-08 20:03:35.000000000 +0200
@@ -14,9 +14,8 @@
# limitations under the License.
"""Limits interface (v2 extension)"""
-from six.moves.urllib import parse
-
from cinderclient import base
+from cinderclient import utils
class Limits(base.Resource):
@@ -95,6 +94,6 @@
if tenant_id:
opts['tenant_id'] = tenant_id
- query_string = "?%s" % parse.urlencode(opts) if opts else ""
+ query_string = utils.build_query_param(opts)
return self._get("/limits%s" % query_string, "limits")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v2/shell.py new/python-cinderclient-4.1.0/cinderclient/v2/shell.py
--- old/python-cinderclient-4.0.1/cinderclient/v2/shell.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v2/shell.py 2018-10-08 20:03:35.000000000 +0200
@@ -290,7 +290,9 @@
dest='scheduler_hints',
action='append',
default=[],
- help='Scheduler hint, like in nova.')
+ help='Scheduler hint, similar to nova. Repeat option to set '
+ 'multiple hints. Values with the same key will be stored '
+ 'as a list.')
@utils.arg('--allow-multiattach',
dest='multiattach',
action="store_true",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v3/group_snapshots.py new/python-cinderclient-4.1.0/cinderclient/v3/group_snapshots.py
--- old/python-cinderclient-4.0.1/cinderclient/v3/group_snapshots.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v3/group_snapshots.py 2018-10-08 20:03:35.000000000 +0200
@@ -96,7 +96,7 @@
:param search_opts: search options
:rtype: list of :class:`GroupSnapshot`
"""
- query_string = utils.build_query_param(search_opts)
+ query_string = utils.build_query_param(search_opts, sort=True)
detail = ""
if detailed:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v3/groups.py new/python-cinderclient-4.1.0/cinderclient/v3/groups.py
--- old/python-cinderclient-4.0.1/cinderclient/v3/groups.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v3/groups.py 2018-10-08 20:03:35.000000000 +0200
@@ -14,8 +14,6 @@
# under the License.
"""Group interface (v3 extension)."""
-from six.moves.urllib import parse
-
from cinderclient import api_versions
from cinderclient.apiclient import base as common_base
from cinderclient import base
@@ -140,11 +138,7 @@
:rtype: :class:`Group`
"""
query_params = utils.unicode_key_value_to_string(kwargs)
-
- query_string = ""
- if query_params:
- params = sorted(query_params.items(), key=lambda x: x[0])
- query_string = "?%s" % parse.urlencode(params)
+ query_string = utils.build_query_param(query_params, sort=True)
return self._get("/groups/%s" % group_id + query_string,
"group")
@@ -159,7 +153,7 @@
if not search_opts:
search_opts = {}
search_opts['list_volume'] = True
- query_string = utils.build_query_param(search_opts)
+ query_string = utils.build_query_param(search_opts, sort=True)
detail = ""
if detailed:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v3/shell.py new/python-cinderclient-4.1.0/cinderclient/v3/shell.py
--- old/python-cinderclient-4.0.1/cinderclient/v3/shell.py 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v3/shell.py 2018-10-08 20:03:35.000000000 +0200
@@ -481,7 +481,7 @@
type=int,
action=CheckSizeArgForCreate,
help='Size of volume, in GiBs. (Required unless '
- 'snapshot-id/source-volid is specified).')
+ 'snapshot-id/source-volid/backup-id is specified).')
@utils.arg('--consisgroup-id',
metavar='<consistencygroup-id>',
default=None,
@@ -560,7 +560,9 @@
dest='scheduler_hints',
action='append',
default=[],
- help='Scheduler hint, like in nova.')
+ help='Scheduler hint, similar to nova. Repeat option to set '
+ 'multiple hints. Values with the same key will be stored '
+ 'as a list.')
@utils.arg('--allow-multiattach',
dest='multiattach',
action="store_true",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/cinderclient/v3/volume_transfers.py new/python-cinderclient-4.1.0/cinderclient/v3/volume_transfers.py
--- old/python-cinderclient-4.0.1/cinderclient/v3/volume_transfers.py 2018-08-01 18:15:51.000000000 +0200
+++ new/python-cinderclient-4.1.0/cinderclient/v3/volume_transfers.py 2018-10-08 20:03:35.000000000 +0200
@@ -13,10 +13,10 @@
# License for the specific language governing permissions and limitations
# under the License.
-"""
-Volume transfer interface (v3 extension).
-"""
+"""Volume transfer interface (v3 extension)."""
+from cinderclient import base
+from cinderclient import utils
from cinderclient.v2 import volume_transfers
@@ -33,4 +33,63 @@
'name': name}}
if self.api_version.matches('3.55'):
body['transfer']['no_snapshots'] = no_snapshots
- return self._create('/volume-transfers', body, 'transfer')
+ return self._create('/volume-transfers', body, 'transfer')
+
+ return self._create('/os-volume-transfer', body, 'transfer')
+
+ def accept(self, transfer_id, auth_key):
+ """Accept a volume transfer.
+
+ :param transfer_id: The ID of the transfer to accept.
+ :param auth_key: The auth_key of the transfer.
+ :rtype: :class:`VolumeTransfer`
+ """
+ body = {'accept': {'auth_key': auth_key}}
+ if self.api_version.matches('3.55'):
+ return self._create('/volume-transfers/%s/accept' % transfer_id,
+ body, 'transfer')
+
+ return self._create('/os-volume-transfer/%s/accept' % transfer_id,
+ body, 'transfer')
+
+ def get(self, transfer_id):
+ """Show details of a volume transfer.
+
+ :param transfer_id: The ID of the volume transfer to display.
+ :rtype: :class:`VolumeTransfer`
+ """
+ if self.api_version.matches('3.55'):
+ return self._get("/volume-transfers/%s" % transfer_id, "transfer")
+
+ return self._get("/os-volume-transfer/%s" % transfer_id, "transfer")
+
+ def list(self, detailed=True, search_opts=None):
+ """Get a list of all volume transfer.
+
+ :param detailed: Get detailed object information.
+ :param search_opts: Filtering options.
+ :rtype: list of :class:`VolumeTransfer`
+ """
+ query_string = utils.build_query_param(search_opts)
+
+ detail = ""
+ if detailed:
+ detail = "/detail"
+
+ if self.api_version.matches('3.55'):
+ return self._list("/volume-transfers%s%s" % (detail, query_string),
+ "transfers")
+
+ return self._list("/os-volume-transfer%s%s" % (detail, query_string),
+ "transfers")
+
+ def delete(self, transfer_id):
+ """Delete a volume transfer.
+
+ :param transfer_id: The :class:`VolumeTransfer` to delete.
+ """
+ if self.api_version.matches('3.55'):
+ return self._delete(
+ "/volume-transfers/%s" % base.getid(transfer_id))
+
+ return self._delete("/os-volume-transfer/%s" % base.getid(transfer_id))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/python_cinderclient.egg-info/PKG-INFO new/python-cinderclient-4.1.0/python_cinderclient.egg-info/PKG-INFO
--- old/python-cinderclient-4.0.1/python_cinderclient.egg-info/PKG-INFO 2018-08-01 18:17:44.000000000 +0200
+++ new/python-cinderclient-4.1.0/python_cinderclient.egg-info/PKG-INFO 2018-10-08 20:04:26.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: python-cinderclient
-Version: 4.0.1
+Version: 4.1.0
Summary: OpenStack Block Storage API Client Library
Home-page: https://docs.openstack.org/python-cinderclient/latest/
Author: OpenStack
@@ -44,7 +44,7 @@
for the Rackspace API solely or the BSD license, you should use that repository.
python-cinderclient is licensed under the Apache License like the rest of OpenStack.
- __ https://github.com/jacobian-archive/python-cloudservers
+ __ https://github.com/rackerlabs/python-cloudservers
* License: Apache License, Version 2.0
* `PyPi`_ - package installation
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/python_cinderclient.egg-info/SOURCES.txt new/python-cinderclient-4.1.0/python_cinderclient.egg-info/SOURCES.txt
--- old/python-cinderclient-4.0.1/python_cinderclient.egg-info/SOURCES.txt 2018-08-01 18:17:45.000000000 +0200
+++ new/python-cinderclient-4.1.0/python_cinderclient.egg-info/SOURCES.txt 2018-10-08 20:04:27.000000000 +0200
@@ -260,6 +260,7 @@
releasenotes/source/ocata.rst
releasenotes/source/pike.rst
releasenotes/source/queens.rst
+releasenotes/source/rocky.rst
releasenotes/source/unreleased.rst
releasenotes/source/_static/.placeholder
releasenotes/source/_templates/.placeholder
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/python_cinderclient.egg-info/pbr.json new/python-cinderclient-4.1.0/python_cinderclient.egg-info/pbr.json
--- old/python-cinderclient-4.0.1/python_cinderclient.egg-info/pbr.json 2018-08-01 18:17:44.000000000 +0200
+++ new/python-cinderclient-4.1.0/python_cinderclient.egg-info/pbr.json 2018-10-08 20:04:26.000000000 +0200
@@ -1 +1 @@
-{"git_version": "460229c", "is_release": true}
\ No newline at end of file
+{"git_version": "4e17e1d", "is_release": true}
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/releasenotes/notes/reno.cache new/python-cinderclient-4.1.0/releasenotes/notes/reno.cache
--- old/python-cinderclient-4.0.1/releasenotes/notes/reno.cache 2018-08-01 18:17:46.000000000 +0200
+++ new/python-cinderclient-4.1.0/releasenotes/notes/reno.cache 1970-01-01 01:00:00.000000000 +0100
@@ -1,87 +0,0 @@
----
-file-contents:
- releasenotes/notes/attachment-mode-8427aa6a2fa26e70.yaml:
- features: ['Added the ability to specify the read-write or read-only mode of an
-
- attachment starting with microversion 3.54. The command line usage is
-
- `cinder attachment-create --mode [rw|ro]`.
-
- ']
- releasenotes/notes/feature-cross-az-backups-9d428ad4dfc552e1.yaml:
- features: ['Support cross AZ backup creation specifying desired backup service
- AZ
-
- (added in microversion v3.51)
-
- ']
- releasenotes/notes/remove-deprecations-621919062f867015.yaml:
- upgrade: ["The following CLI options were deprecated for one or more releases\
- \ and have\nnow been removed:\n\n``--endpoint-type``\n This option has been\
- \ replaced by ``--os-endpoint-type``.\n\n``--bypass-url``\n This option has\
- \ been replaced by ``--os-endpoint``.\n\n``--os-auth-system``\n This option\
- \ has been replaced by ``--os-auth-type``.\n"]
- releasenotes/notes/remove-replv1-cabf2194edb9d963.yaml:
- upgrade: ['The volume creation argument ``--source-replica`` on the command line
- and
-
- the ``source_replica`` kwarg for the ``create()`` call when using the
-
- cinderclient library were for the replication v1 support that was removed
-
- in the Mitaka release. These options have now been removed.
-
- ']
- releasenotes/notes/support-filter-type-7yt69ub7ccbf7419.yaml:
- features: ['New command option ``--filters`` is added to ``type-list`` command
- to support filter types since 3.52, and it''s only valid for administrator.']
- releasenotes/notes/transfer-snapshots-555c61477835bcf7.yaml:
- features: ['Starting with microversion 3.55, the volume transfer command now has
- the
-
- ability to exclude a volume''s snapshots when transferring a volume to another
-
- project. The new command format is `cinder transfer-create --no-snapshots`.
-
- ']
- releasenotes/notes/volume-transfer-bug-23c760efb9f98a4d.yaml:
- fixes: ['An issue was discovered with the way API microversions were handled for
- the
-
- new volume-transfer with snapshot handling with microversion 3.55. This
-
- release includes a fix to keep backwards compatibility with earlier
-
- releases. See `bug #1784703
-
- https://bugs.launchpad.net/cinder/+bug/1784703`_ for more details.
-
- ']
-notes:
-- files:
- - - releasenotes/notes/volume-transfer-bug-23c760efb9f98a4d.yaml
- - !!binary |
- NDYwMjI5YzYwOTk3MTlkZWMwZDAyN2Y3OThmOWM3NTFiOGVjN2U0NA==
- version: 4.0.1
-- files:
- - - releasenotes/notes/attachment-mode-8427aa6a2fa26e70.yaml
- - !!binary |
- ODI2YzVmYzE2ZDZmNTcyY2Y1NDRlM2YwYTkxMzMwYmY5MjcwMWM2OQ==
- - - releasenotes/notes/remove-deprecations-621919062f867015.yaml
- - !!binary |
- YTMzMWYwNmRmMDE1OGZmZjI4MTYyZWFiYzc2NWYxNjQ4NTVhZmNlZQ==
- - - releasenotes/notes/remove-replv1-cabf2194edb9d963.yaml
- - !!binary |
- MzIyNTFmMGVhMzg2MzA5OGI0ZDRkNTQzNjRjOGVlMThmZjE3MGE0NA==
- - - releasenotes/notes/transfer-snapshots-555c61477835bcf7.yaml
- - !!binary |
- YTU1NGZhYTY1MzBmYTBiYjcwNDMwNTcyODY5YTZhMjU1NTc4MzkxMg==
- version: 4.0.0
-- files:
- - - releasenotes/notes/feature-cross-az-backups-9d428ad4dfc552e1.yaml
- - !!binary |
- MmM3NzRjYzAxNWNiNjYyNGZlMzc4MjNiNTg2ODY0YzYzNTI1YzM3OQ==
- - - releasenotes/notes/support-filter-type-7yt69ub7ccbf7419.yaml
- - !!binary |
- NWExNTEzMjQ0Y2FmN2FjYmQ0MWUxODE0MTliYzhiNjJiZjRiY2FiYQ==
- version: 3.6.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/releasenotes/source/index.rst new/python-cinderclient-4.1.0/releasenotes/source/index.rst
--- old/python-cinderclient-4.0.1/releasenotes/source/index.rst 2018-08-01 18:15:36.000000000 +0200
+++ new/python-cinderclient-4.1.0/releasenotes/source/index.rst 2018-10-08 20:03:35.000000000 +0200
@@ -6,6 +6,7 @@
:maxdepth: 1
unreleased
+ rocky
queens
pike
ocata
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-cinderclient-4.0.1/releasenotes/source/rocky.rst new/python-cinderclient-4.1.0/releasenotes/source/rocky.rst
--- old/python-cinderclient-4.0.1/releasenotes/source/rocky.rst 1970-01-01 01:00:00.000000000 +0100
+++ new/python-cinderclient-4.1.0/releasenotes/source/rocky.rst 2018-10-08 20:03:35.000000000 +0200
@@ -0,0 +1,6 @@
+===================================
+ Rocky Series Release Notes
+===================================
+
+.. release-notes::
+ :branch: stable/rocky