summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/source/authentication.rst4
-rw-r--r--doc/source/backwards-incompatible.rst12
-rw-r--r--functional/tests/image/v1/test_image.py17
-rw-r--r--functional/tests/volume/v1/test_volume.py2
-rw-r--r--openstackclient/api/object_store_v1.py35
-rw-r--r--openstackclient/identity/v3/role.py5
-rw-r--r--openstackclient/image/v1/image.py10
-rw-r--r--openstackclient/image/v2/image.py5
-rw-r--r--openstackclient/tests/identity/v3/test_role.py38
-rw-r--r--openstackclient/tests/image/v1/test_image.py12
-rw-r--r--openstackclient/tests/image/v2/test_image.py5
-rwxr-xr-xpost_test_hook.sh2
-rw-r--r--requirements.txt2
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