diff options
| -rw-r--r-- | doc/source/authentication.rst | 4 | ||||
| -rw-r--r-- | doc/source/backwards-incompatible.rst | 12 | ||||
| -rw-r--r-- | functional/tests/image/v1/test_image.py | 17 | ||||
| -rw-r--r-- | functional/tests/volume/v1/test_volume.py | 2 | ||||
| -rw-r--r-- | openstackclient/api/object_store_v1.py | 35 | ||||
| -rw-r--r-- | openstackclient/identity/v3/role.py | 5 | ||||
| -rw-r--r-- | openstackclient/image/v1/image.py | 10 | ||||
| -rw-r--r-- | openstackclient/image/v2/image.py | 5 | ||||
| -rw-r--r-- | openstackclient/tests/identity/v3/test_role.py | 38 | ||||
| -rw-r--r-- | openstackclient/tests/image/v1/test_image.py | 12 | ||||
| -rw-r--r-- | openstackclient/tests/image/v2/test_image.py | 5 | ||||
| -rwxr-xr-x | post_test_hook.sh | 2 | ||||
| -rw-r--r-- | requirements.txt | 2 |
13 files changed, 98 insertions, 51 deletions
diff --git a/doc/source/authentication.rst b/doc/source/authentication.rst index bf23b66a..a3986ee4 100644 --- a/doc/source/authentication.rst +++ b/doc/source/authentication.rst @@ -83,7 +83,7 @@ by the ``ClientManager`` object. * Load the selected plugin class. * When an operation that requires authentication is attempted ``ClientManager`` - makes the actual inital request to the Identity service. + makes the actual initial request to the Identity service. * if ``--os-auth-url`` is not supplied for any of the types except Token/Endpoint, exit with an error. @@ -132,7 +132,7 @@ If using a domain as authorization scope, set either it's name or ID. Note that if the user and project share the same domain, then simply setting ``os-default-domain`` or ``OS_DEFAULT_DOMAIN`` is sufficient. -Thus, a minimal set of of environment variables would be: +Thus, a minimal set of environment variables would be: .. code-block:: bash diff --git a/doc/source/backwards-incompatible.rst b/doc/source/backwards-incompatible.rst index e89cc3a6..f9f2ed44 100644 --- a/doc/source/backwards-incompatible.rst +++ b/doc/source/backwards-incompatible.rst @@ -90,6 +90,18 @@ List of Backwards Incompatible Changes * Bug: https://bugs.launchpad.net/python-openstackclient/+bug/1453229 * Commit: https://review.openstack.org/#/c/181514/ +7. `image set` commands will no longer return the modified resource + + Previously, modifying an image would result in the new image being displayed + to the user. To keep things consistent with other `set` commands, we will + no longer be showing the modified resource. + + * In favor of: Use `set` then `show` + * As of: NA + * Removed in: NA + * Bug: NA + * Commit: NA + For Developers ============== diff --git a/functional/tests/image/v1/test_image.py b/functional/tests/image/v1/test_image.py index 17c0c3dd..fe61f830 100644 --- a/functional/tests/image/v1/test_image.py +++ b/functional/tests/image/v1/test_image.py @@ -35,10 +35,9 @@ class ImageTests(test.TestCase): @classmethod def tearDownClass(cls): # Rename test - opts = cls.get_show_opts(cls.FIELDS) - raw_output = cls.openstack( - 'image set --name ' + cls.OTHER_NAME + ' ' + cls.NAME + opts) - cls.assertOutput(cls.OTHER_NAME + "\n", raw_output) + raw_output = cls.openstack('image set --name ' + cls.OTHER_NAME + ' ' + + cls.NAME) + cls.assertOutput('', raw_output) # Delete test raw_output = cls.openstack('image delete ' + cls.OTHER_NAME) cls.assertOutput('', raw_output) @@ -56,13 +55,13 @@ class ImageTests(test.TestCase): def test_image_set(self): opts = self.get_show_opts([ "disk_format", "is_public", "min_disk", "min_ram", "name"]) - raw_output = self.openstack('image set --min-disk 4 --min-ram 5 ' + - '--disk-format qcow2 --public ' + - self.NAME + opts) + self.openstack('image set --min-disk 4 --min-ram 5 ' + + '--disk-format qcow2 --public ' + self.NAME) + raw_output = self.openstack('image show ' + self.NAME + opts) self.assertEqual("qcow2\nTrue\n4\n5\n" + self.NAME + '\n', raw_output) def test_image_metadata(self): opts = self.get_show_opts(["name", "properties"]) - raw_output = self.openstack( - 'image set --property a=b --property c=d ' + self.NAME + opts) + self.openstack('image set --property a=b --property c=d ' + self.NAME) + raw_output = self.openstack('image show ' + self.NAME + opts) self.assertEqual(self.NAME + "\na='b', c='d'\n", raw_output) diff --git a/functional/tests/volume/v1/test_volume.py b/functional/tests/volume/v1/test_volume.py index 596b8217..874be6e1 100644 --- a/functional/tests/volume/v1/test_volume.py +++ b/functional/tests/volume/v1/test_volume.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +import os import uuid from functional.tests.volume.v1 import common @@ -25,6 +26,7 @@ class VolumeTests(common.BaseVolumeTests): @classmethod def setUpClass(cls): + os.environ['OS_VOLUME_API_VERSION'] = '1' opts = cls.get_show_opts(cls.FIELDS) raw_output = cls.openstack('volume create --size 1 ' + cls.NAME + opts) expected = cls.NAME + '\n' diff --git a/openstackclient/api/object_store_v1.py b/openstackclient/api/object_store_v1.py index c870332a..ae03ab7d 100644 --- a/openstackclient/api/object_store_v1.py +++ b/openstackclient/api/object_store_v1.py @@ -16,6 +16,7 @@ import io import os import six +from six.moves import urllib try: from urllib.parse import urlparse # noqa @@ -42,8 +43,7 @@ class APIv1(api.BaseAPI): :returns: dict of returned headers """ - - response = self.create(container, method='PUT') + response = self.create(urllib.parse.quote(container), method='PUT') data = { 'account': self._find_account_id(), 'container': container, @@ -63,7 +63,7 @@ class APIv1(api.BaseAPI): """ if container: - self.delete(container) + self.delete(urllib.parse.quote(container)) def container_list( self, @@ -154,7 +154,7 @@ class APIv1(api.BaseAPI): headers = self._set_properties(properties, 'X-Container-Meta-%s') if headers: - self.create(container, headers=headers) + self.create(urllib.parse.quote(container), headers=headers) def container_show( self, @@ -168,7 +168,7 @@ class APIv1(api.BaseAPI): dict of returned headers """ - response = self._request('HEAD', container) + response = self._request('HEAD', urllib.parse.quote(container)) data = { 'account': self._find_account_id(), 'container': container, @@ -201,7 +201,7 @@ class APIv1(api.BaseAPI): headers = self._unset_properties(properties, 'X-Remove-Container-Meta-%s') if headers: - self.create(container, headers=headers) + self.create(urllib.parse.quote(container), headers=headers) def object_create( self, @@ -222,7 +222,8 @@ class APIv1(api.BaseAPI): # TODO(dtroyer): What exception to raise here? return {} - full_url = "%s/%s" % (container, object) + full_url = "%s/%s" % (urllib.parse.quote(container), + urllib.parse.quote(object)) with io.open(object, 'rb') as f: response = self.create( full_url, @@ -255,7 +256,8 @@ class APIv1(api.BaseAPI): if container is None or object is None: return - self.delete("%s/%s" % (container, object)) + self.delete("%s/%s" % (urllib.parse.quote(container), + urllib.parse.quote(object))) def object_list( self, @@ -332,7 +334,7 @@ class APIv1(api.BaseAPI): if delimiter: params['delimiter'] = delimiter - return self.list(container, **params) + return self.list(urllib.parse.quote(container), **params) def object_save( self, @@ -355,7 +357,8 @@ class APIv1(api.BaseAPI): response = self._request( 'GET', - "%s/%s" % (container, object), + "%s/%s" % (urllib.parse.quote(container), + urllib.parse.quote(object)), stream=True, ) if response.status_code == 200: @@ -384,7 +387,9 @@ class APIv1(api.BaseAPI): headers = self._set_properties(properties, 'X-Object-Meta-%s') if headers: - self.create("%s/%s" % (container, object), headers=headers) + self.create("%s/%s" % (urllib.parse.quote(container), + urllib.parse.quote(object)), + headers=headers) def object_unset( self, @@ -404,7 +409,9 @@ class APIv1(api.BaseAPI): headers = self._unset_properties(properties, 'X-Remove-Object-Meta-%s') if headers: - self.create("%s/%s" % (container, object), headers=headers) + self.create("%s/%s" % (urllib.parse.quote(container), + urllib.parse.quote(object)), + headers=headers) def object_show( self, @@ -424,7 +431,9 @@ class APIv1(api.BaseAPI): if container is None or object is None: return {} - response = self._request('HEAD', "%s/%s" % (container, object)) + response = self._request('HEAD', "%s/%s" % + (urllib.parse.quote(container), + urllib.parse.quote(object))) data = { 'account': self._find_account_id(), 'container': container, diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py index c72de477..0e8c51ca 100644 --- a/openstackclient/identity/v3/role.py +++ b/openstackclient/identity/v3/role.py @@ -260,6 +260,7 @@ class ListRole(lister.Lister): data = identity_client.roles.list( user=user, domain=domain, + os_inherit_extension_inherited=parsed_args.inherited ) for user_role in data: user_role.user = user.name @@ -269,6 +270,7 @@ class ListRole(lister.Lister): data = identity_client.roles.list( user=user, project=project, + os_inherit_extension_inherited=parsed_args.inherited ) for user_role in data: user_role.user = user.name @@ -278,12 +280,14 @@ class ListRole(lister.Lister): data = identity_client.roles.list( user=user, domain='default', + os_inherit_extension_inherited=parsed_args.inherited ) elif parsed_args.group and parsed_args.domain: columns = ('ID', 'Name', 'Domain', 'Group') data = identity_client.roles.list( group=group, domain=domain, + os_inherit_extension_inherited=parsed_args.inherited ) for group_role in data: group_role.group = group.name @@ -293,6 +297,7 @@ class ListRole(lister.Lister): data = identity_client.roles.list( group=group, project=project, + os_inherit_extension_inherited=parsed_args.inherited ) for group_role in data: group_role.group = group.name diff --git a/openstackclient/image/v1/image.py b/openstackclient/image/v1/image.py index 81d384f7..35e9ef43 100644 --- a/openstackclient/image/v1/image.py +++ b/openstackclient/image/v1/image.py @@ -454,7 +454,7 @@ class SaveImage(command.Command): gc_utils.save_image(data, parsed_args.file) -class SetImage(show.ShowOne): +class SetImage(command.Command): """Set image properties""" log = logging.getLogger(__name__ + ".SetImage") @@ -631,7 +631,7 @@ class SetImage(show.ShowOne): volume_client.volumes, parsed_args.volume, ) - response, body = volume_client.volumes.upload_to_image( + volume_client.volumes.upload_to_image( source_volume.id, parsed_args.force, parsed_args.image, @@ -642,7 +642,6 @@ class SetImage(show.ShowOne): if parsed_args.disk_format else image.disk_format), ) - info = body['os-volume_upload_image'] elif parsed_args.file: # Send an open file handle to glanceclient so it will # do a chunked transfer @@ -675,10 +674,7 @@ class SetImage(show.ShowOne): kwargs['data'] != sys.stdin): kwargs['data'].close() - info = {} - info.update(image._info) - info['properties'] = utils.format_dict(info.get('properties', {})) - return zip(*sorted(six.iteritems(info))) + return class ShowImage(show.ShowOne): diff --git a/openstackclient/image/v2/image.py b/openstackclient/image/v2/image.py index 7ef1f780..7d8b1412 100644 --- a/openstackclient/image/v2/image.py +++ b/openstackclient/image/v2/image.py @@ -521,7 +521,7 @@ class SaveImage(command.Command): gc_utils.save_image(data, parsed_args.file) -class SetImage(show.ShowOne): +class SetImage(command.Command): """Set image properties""" log = logging.getLogger(__name__ + ".SetImage") @@ -717,9 +717,6 @@ class SetImage(show.ShowOne): kwargs['tags'] = list(set(image.tags).union(set(parsed_args.tags))) image = image_client.images.update(image.id, **kwargs) - info = {} - info.update(image) - return zip(*sorted(six.iteritems(info))) class ShowImage(show.ShowOne): diff --git a/openstackclient/tests/identity/v3/test_role.py b/openstackclient/tests/identity/v3/test_role.py index 4a0ba066..8ad4b099 100644 --- a/openstackclient/tests/identity/v3/test_role.py +++ b/openstackclient/tests/identity/v3/test_role.py @@ -367,6 +367,39 @@ class TestRoleList(TestRole): ), ) self.assertEqual(datalist, tuple(data)) + def test_user_list_inherited(self): + arglist = [ + '--user', identity_fakes.user_id, + '--inherited', + ] + verifylist = [ + ('user', identity_fakes.user_id), + ('inherited', True), + ] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + columns, data = self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'domain': 'default', + 'user': self.users_mock.get(), + 'os_inherit_extension_inherited': True, + } + # RoleManager.list(user=, group=, domain=, project=, **kwargs) + self.roles_mock.list.assert_called_with( + **kwargs + ) + + collist = ('ID', 'Name') + self.assertEqual(collist, columns) + datalist = (( + identity_fakes.role_id, + identity_fakes.role_name, + ), ) + self.assertEqual(datalist, tuple(data)) + def test_user_list_user(self): arglist = [ '--user', identity_fakes.user_id, @@ -383,6 +416,7 @@ class TestRoleList(TestRole): kwargs = { 'domain': 'default', 'user': self.users_mock.get(), + 'os_inherit_extension_inherited': False } # RoleManager.list(user=, group=, domain=, project=, **kwargs) self.roles_mock.list.assert_called_with( @@ -415,6 +449,7 @@ class TestRoleList(TestRole): kwargs = { 'domain': self.domains_mock.get(), 'user': self.users_mock.get(), + 'os_inherit_extension_inherited': False } # RoleManager.list(user=, group=, domain=, project=, **kwargs) self.roles_mock.list.assert_called_with( @@ -449,6 +484,7 @@ class TestRoleList(TestRole): kwargs = { 'domain': self.domains_mock.get(), 'group': self.groups_mock.get(), + 'os_inherit_extension_inherited': False } # RoleManager.list(user=, group=, domain=, project=, **kwargs) self.roles_mock.list.assert_called_with( @@ -483,6 +519,7 @@ class TestRoleList(TestRole): kwargs = { 'project': self.projects_mock.get(), 'user': self.users_mock.get(), + 'os_inherit_extension_inherited': False } # RoleManager.list(user=, group=, domain=, project=, **kwargs) self.roles_mock.list.assert_called_with( @@ -517,6 +554,7 @@ class TestRoleList(TestRole): kwargs = { 'project': self.projects_mock.get(), 'group': self.groups_mock.get(), + 'os_inherit_extension_inherited': False } # RoleManager.list(user=, group=, domain=, project=, **kwargs) self.roles_mock.list.assert_called_with( diff --git a/openstackclient/tests/image/v1/test_image.py b/openstackclient/tests/image/v1/test_image.py index a79df8b4..d10d3b15 100644 --- a/openstackclient/tests/image/v1/test_image.py +++ b/openstackclient/tests/image/v1/test_image.py @@ -499,8 +499,7 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) kwargs = { 'name': 'new-name', @@ -517,9 +516,6 @@ class TestImageSet(TestImage): **kwargs ) - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) - def test_image_set_bools1(self): arglist = [ '--protected', @@ -644,8 +640,7 @@ class TestImageSet(TestImage): ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - # DisplayCommandBase.take_action() returns two tuples - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) # VolumeManager.upload_to_image(volume, force, image_name, # container_format, disk_format) @@ -664,9 +659,6 @@ class TestImageSet(TestImage): volume='volly', ) - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) - class TestImageShow(TestImage): diff --git a/openstackclient/tests/image/v2/test_image.py b/openstackclient/tests/image/v2/test_image.py index 46da9c68..4ce85475 100644 --- a/openstackclient/tests/image/v2/test_image.py +++ b/openstackclient/tests/image/v2/test_image.py @@ -676,7 +676,7 @@ class TestImageSet(TestImage): parsed_args = self.check_parser(self.cmd, arglist, verifylist) # DisplayCommandBase.take_action() returns two tuples - columns, data = self.cmd.take_action(parsed_args) + self.cmd.take_action(parsed_args) kwargs = { 'name': 'new-name', @@ -690,9 +690,6 @@ class TestImageSet(TestImage): self.images_mock.update.assert_called_with( image_fakes.image_id, **kwargs) - self.assertEqual(image_fakes.IMAGE_columns, columns) - self.assertEqual(image_fakes.IMAGE_data, data) - def test_image_set_bools1(self): arglist = [ '--protected', diff --git a/post_test_hook.sh b/post_test_hook.sh index 4c35b520..7bb036f9 100755 --- a/post_test_hook.sh +++ b/post_test_hook.sh @@ -12,7 +12,7 @@ OPENSTACKCLIENT_DIR=$(cd $(dirname "$0") && pwd) echo "Running openstackclient functional test suite" sudo -H -u stack -i <<! -source ~stack/devstack/accrc/admin/admin +source ~stack/devstack/openrc admin admin echo 'Running tests with:' env | grep OS_ cd ${OPENSTACKCLIENT_DIR} diff --git a/requirements.txt b/requirements.txt index c638ed18..2556c135 100644 --- a/requirements.txt +++ b/requirements.txt @@ -13,7 +13,7 @@ oslo.i18n>=1.5.0 # Apache-2.0 oslo.utils>=2.0.0 # Apache-2.0 python-glanceclient>=0.18.0 python-keystoneclient>=1.6.0 -python-novaclient>=2.28.1 +python-novaclient>=2.29.0 python-cinderclient>=1.3.1 python-neutronclient>=2.6.0 requests>=2.5.2 |
