Merge "Fix update_image unsupported media type"

This commit is contained in:
Jenkins 2017-06-07 17:00:46 +00:00 committed by Gerrit Code Review
commit c8f5194fdc
5 changed files with 67 additions and 3 deletions

View File

@ -158,7 +158,8 @@ class Proxy(proxy2.BaseProxy):
:returns: The updated image
:rtype: :class:`~openstack.image.v2.image.Image`
"""
return self._update(_image.Image, image, **attrs)
img = self._get_resource(_image.Image, image)
return img.update(self._session, **attrs)
def deactivate_image(self, image):
"""Deactivate an image

View File

@ -13,6 +13,8 @@
import hashlib
import logging
import jsonpatch
from openstack import exceptions
from openstack.image import image_service
from openstack import resource2
@ -283,3 +285,17 @@ class Image(resource2.Resource):
"Unable to verify the integrity of image %s" % (self.id))
return resp.content
def update(self, session, **attrs):
url = utils.urljoin(self.base_path, self.id)
headers = {
'Content-Type': 'application/openstack-images-v2.1-json-patch',
'Accept': ''
}
original = self.to_dict()
patch_string = jsonpatch.make_patch(original, attrs).to_string()
resp = session.patch(url, endpoint_filter=self.service,
data=patch_string,
headers=headers)
self._translate_response(resp, has_body=True)
return self

View File

@ -10,6 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import json
import mock
import testtools
@ -292,3 +294,33 @@ class TestImage(testtools.TestCase):
stream=True)
self.assertEqual(rv, resp)
def test_image_update(self):
sot = image.Image(**EXAMPLE)
# Let the translate pass through, that portion is tested elsewhere
sot._translate_response = mock.Mock()
resp = mock.Mock()
resp.content = b"abc"
headers = {
'Content-Type': 'application/openstack-images-v2.1-json-patch',
'Accept': '',
}
resp.headers = headers
resp.status_code = 200
self.sess.patch.return_value = resp
value = ('[{"value": "fake_name", "op": "replace", "path": "/name"}, '
'{"value": "fake_value", "op": "add", '
'"path": "/new_property"}]')
fake_img = sot.to_dict()
fake_img['name'] = 'fake_name'
fake_img['new_property'] = 'fake_value'
sot.update(self.sess, **fake_img)
url = 'images/' + IDENTIFIER
self.sess.patch.assert_called_once()
call = self.sess.patch.call_args
call_args, call_kwargs = call
self.assertEqual(url, call_args[0])
self.assertEqual(json.loads(value), json.loads(call_kwargs['data']))

View File

@ -16,8 +16,11 @@ from openstack import exceptions
from openstack.image.v2 import _proxy
from openstack.image.v2 import image
from openstack.image.v2 import member
from openstack.tests.unit.image.v2 import test_image as fake_image
from openstack.tests.unit import test_proxy_base2
EXAMPLE = fake_image.EXAMPLE
class TestImageProxy(test_proxy_base2.TestProxyBase):
def setUp(self):
@ -53,8 +56,19 @@ class TestImageProxy(test_proxy_base2.TestProxyBase):
def test_image_delete_ignore(self):
self.verify_delete(self.proxy.delete_image, image.Image, True)
def test_image_update(self):
self.verify_update(self.proxy.update_image, image.Image)
@mock.patch("openstack.resource2.Resource._translate_response")
@mock.patch("openstack.proxy2.BaseProxy._get")
@mock.patch("openstack.image.v2.image.Image.update")
def test_image_update(self, mock_update_image, mock_get_image,
mock_transpose):
original_image = image.Image(**EXAMPLE)
mock_get_image.return_value = original_image
EXAMPLE['name'] = 'fake_name'
updated_image = image.Image(**EXAMPLE)
mock_update_image.return_value = updated_image.to_dict()
result = self.proxy.update_image(original_image,
**updated_image.to_dict())
self.assertEqual('fake_name', result.get('name'))
def test_image_get(self):
self.verify_get(self.proxy.get_image, image.Image)

View File

@ -2,6 +2,7 @@
# of appearance. Changing the order has an impact on the overall integration
# process, which may cause wedges in the gate later.
pbr!=2.1.0,>=2.0.0 # Apache-2.0
jsonpatch>=1.1 # BSD
six>=1.9.0 # MIT
stevedore>=1.20.0 # Apache-2.0
os-client-config>=1.27.0 # Apache-2.0