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