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 <gerhard@qux.nl> Gloria Gu <gloria.gu@hp.com> Gorka Eguileor <geguileo@redhat.com> +Goutham Pacha Ravi <gouthampravi@gmail.com> Gábor Antal <antal@inf.u-szeged.hu> Haneef Ali <haneef.ali@hp.com> Hangdong Zhang <hdzhang@fiberhome.com> @@ -222,7 +223,6 @@ ZhiQiang Fan <aji.zqfan@gmail.com> Zhiteng Huang <zhiteng.huang@intel.com> Zhiteng Huang <zhithuang@ebaysf.com> -Zuul <zuul@review.openstack.org> abhishekkekane <abhishek.kekane@nttdata.com> alex <wujian3659@163.com> bhagyashris <bhagyashri.shewale@nttdata.com> @@ -288,6 +288,8 @@ wanghao <sxmatch1986@gmail.com> wanghao <wanghao749@huawei.com> wangxiyuan <wangxiyuan@huawei.com> +whoami-rajat <rajatdhasmana@gmail.com> +wu.chunyang <wu.chunyang@99cloud.net> xianming mao <xianming.mao@easystack.cn> xiexs <xiexs@cn.fujitsu.com> xing-yang <xing.yang@emc.com> @@ -303,4 +305,5 @@ zheng yin <yin.zheng@easystack.cn> zhengyin <zhengyin@chinac.com> zhu.rong <zhu.rong@99cloud.net> +zhubx007 <zhu.boxiang@99cloud.net> zwei <leidong@unitedstack.com> 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( "<Capabilities: %s>" % FAKE_CAPABILITY['namespace'], repr(cap)) + + def test__repr__when_empty(self): + cap = Capabilities(None, {}) + self.assertEqual( + "<Capabilities: None>", 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 "<Capabilities: %s>" % self._info['namespace'] + return "<Capabilities: %s>" % 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