Merge "Add support to stack update"
This commit is contained in:
@@ -67,6 +67,21 @@ class Proxy(proxy.BaseProxy):
|
|||||||
"""
|
"""
|
||||||
return self._get(stack.Stack, value)
|
return self._get(stack.Stack, value)
|
||||||
|
|
||||||
|
def update_stack(self, value, **attrs):
|
||||||
|
"""Update a stack
|
||||||
|
|
||||||
|
:param value: The value can be the ID of a stack or a
|
||||||
|
:class:`~openstack.orchestration.v1.stack.Stack` instance.
|
||||||
|
:param kwargs \*\*attrs: The attributes to update on the stack
|
||||||
|
represented by ``value``.
|
||||||
|
|
||||||
|
:returns: The updated stack
|
||||||
|
:rtype: :class:`~openstack.orchestration.v1.stack.Stack`
|
||||||
|
:raises: :class:`~openstack.exceptions.ResourceNotFound`
|
||||||
|
when no resource can be found.
|
||||||
|
"""
|
||||||
|
return self._update(stack.Stack, value, **attrs)
|
||||||
|
|
||||||
def delete_stack(self, value, ignore_missing=True):
|
def delete_stack(self, value, ignore_missing=True):
|
||||||
"""Delete a stack
|
"""Delete a stack
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ class Stack(resource.Resource):
|
|||||||
allow_create = True
|
allow_create = True
|
||||||
allow_list = True
|
allow_list = True
|
||||||
allow_retrieve = True
|
allow_retrieve = True
|
||||||
|
allow_update = True
|
||||||
allow_delete = True
|
allow_delete = True
|
||||||
|
|
||||||
# Properties
|
# Properties
|
||||||
@@ -81,3 +82,14 @@ class Stack(resource.Resource):
|
|||||||
url = cls.base_path
|
url = cls.base_path
|
||||||
resp = session.post(url, service=cls.service, json=body).body
|
resp = session.post(url, service=cls.service, json=body).body
|
||||||
return resp[cls.resource_key]
|
return resp[cls.resource_key]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def update_by_id(cls, session, resource_id, attrs, path_args=None):
|
||||||
|
# Heat returns a 202 for update operation, we ignore the non-existent
|
||||||
|
# response.body and do an additional get
|
||||||
|
body = attrs.copy()
|
||||||
|
body.pop('id', None)
|
||||||
|
body.pop('name', None)
|
||||||
|
url = cls._get_url(path_args, resource_id)
|
||||||
|
session.put(url, service=cls.service, json=body)
|
||||||
|
return cls.get_by_id(session, resource_id)
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ class TestOrchestrationProxy(test_proxy_base.TestProxyBase):
|
|||||||
def test_stack_get(self):
|
def test_stack_get(self):
|
||||||
self.verify_get(self.proxy.get_stack, stack.Stack)
|
self.verify_get(self.proxy.get_stack, stack.Stack)
|
||||||
|
|
||||||
|
def test_stack_update(self):
|
||||||
|
self.verify_update(self.proxy.update_stack, stack.Stack)
|
||||||
|
|
||||||
def test_stack_delete(self):
|
def test_stack_delete(self):
|
||||||
self.verify_delete(self.proxy.delete_stack, stack.Stack, False)
|
self.verify_delete(self.proxy.delete_stack, stack.Stack, False)
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ class TestStack(testtools.TestCase):
|
|||||||
self.assertEqual('orchestration', sot.service.service_type)
|
self.assertEqual('orchestration', sot.service.service_type)
|
||||||
self.assertTrue(sot.allow_create)
|
self.assertTrue(sot.allow_create)
|
||||||
self.assertTrue(sot.allow_retrieve)
|
self.assertTrue(sot.allow_retrieve)
|
||||||
self.assertFalse(sot.allow_update)
|
self.assertTrue(sot.allow_update)
|
||||||
self.assertTrue(sot.allow_delete)
|
self.assertTrue(sot.allow_delete)
|
||||||
self.assertTrue(sot.allow_list)
|
self.assertTrue(sot.allow_list)
|
||||||
|
|
||||||
@@ -100,6 +100,33 @@ class TestStack(testtools.TestCase):
|
|||||||
self.assertEqual(FAKE_ID, sot.id)
|
self.assertEqual(FAKE_ID, sot.id)
|
||||||
self.assertEqual(FAKE_NAME, sot.name)
|
self.assertEqual(FAKE_NAME, sot.name)
|
||||||
|
|
||||||
|
def test_update(self):
|
||||||
|
# heat responds to update request with an 202 status code
|
||||||
|
resp_update = mock.Mock()
|
||||||
|
resp_update.status_code = 202
|
||||||
|
sess = mock.Mock()
|
||||||
|
sess.put = mock.Mock(return_value=resp_update)
|
||||||
|
|
||||||
|
resp_get = mock.Mock()
|
||||||
|
resp_get.body = {'stack': FAKE_CREATE_RESPONSE}
|
||||||
|
sess.get = mock.Mock(return_value=resp_get)
|
||||||
|
|
||||||
|
# create a stack for update
|
||||||
|
sot = stack.Stack(FAKE)
|
||||||
|
new_body = sot._attrs.copy()
|
||||||
|
del new_body['id']
|
||||||
|
del new_body['name']
|
||||||
|
|
||||||
|
sot.timeout_mins = 119
|
||||||
|
resp = sot.update(sess)
|
||||||
|
|
||||||
|
url = 'stacks/%s' % sot.id
|
||||||
|
new_body['timeout_mins'] = 119
|
||||||
|
sess.put.assert_called_once_with(url, service=sot.service,
|
||||||
|
json=new_body)
|
||||||
|
sess.get.assert_called_once_with(url, service=sot.service)
|
||||||
|
self.assertEqual(sot, resp)
|
||||||
|
|
||||||
def test_check(self):
|
def test_check(self):
|
||||||
session_mock = mock.MagicMock()
|
session_mock = mock.MagicMock()
|
||||||
sot = stack.Stack(FAKE)
|
sot = stack.Stack(FAKE)
|
||||||
|
|||||||
@@ -208,6 +208,16 @@ class TestTransport(TestTransportBase):
|
|||||||
self.assertRequestHeaderEqual(mock_req, 'Accept', transport.JSON)
|
self.assertRequestHeaderEqual(mock_req, 'Accept', transport.JSON)
|
||||||
self.assertEqual(fake_record1, resp.json())
|
self.assertEqual(fake_record1, resp.json())
|
||||||
|
|
||||||
|
@requests_mock.Mocker()
|
||||||
|
def test_request_status_202(self, mock_req):
|
||||||
|
mock_req.put(self.TEST_URL, text='', status_code=202)
|
||||||
|
|
||||||
|
xport = transport.Transport()
|
||||||
|
resp = xport.put(self.TEST_URL, json=fake_record2)
|
||||||
|
|
||||||
|
self.assertEqual(202, resp.status_code)
|
||||||
|
self.assertEqual({}, resp.body)
|
||||||
|
|
||||||
@requests_mock.Mocker()
|
@requests_mock.Mocker()
|
||||||
def test_user_agent_no_arg(self, mock_req):
|
def test_user_agent_no_arg(self, mock_req):
|
||||||
mock_req.get(self.TEST_URL, text=fake_response)
|
mock_req.get(self.TEST_URL, text=fake_response)
|
||||||
|
|||||||
@@ -266,7 +266,9 @@ class Transport(requests.Session):
|
|||||||
details=self._parse_error_response(resp),
|
details=self._parse_error_response(resp),
|
||||||
status_code=resp.status_code)
|
status_code=resp.status_code)
|
||||||
|
|
||||||
if accept == JSON:
|
if resp.status_code == 202:
|
||||||
|
resp.body = {}
|
||||||
|
elif accept == JSON:
|
||||||
try:
|
try:
|
||||||
resp.body = resp.json()
|
resp.body = resp.json()
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
|
|||||||
Reference in New Issue
Block a user