diff --git a/openstack/baremetal/v1/chassis.py b/openstack/baremetal/v1/chassis.py index a8ba9746a..715acb250 100644 --- a/openstack/baremetal/v1/chassis.py +++ b/openstack/baremetal/v1/chassis.py @@ -26,7 +26,7 @@ class Chassis(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'fields' diff --git a/openstack/baremetal/v1/node.py b/openstack/baremetal/v1/node.py index c1b6266ed..008132c3d 100644 --- a/openstack/baremetal/v1/node.py +++ b/openstack/baremetal/v1/node.py @@ -26,7 +26,7 @@ class Node(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'associated', 'driver', 'fields', 'provision_state', 'resource_class', diff --git a/openstack/baremetal/v1/port.py b/openstack/baremetal/v1/port.py index a3f86594c..75f47f68d 100644 --- a/openstack/baremetal/v1/port.py +++ b/openstack/baremetal/v1/port.py @@ -26,7 +26,7 @@ class Port(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'fields' diff --git a/openstack/baremetal/v1/port_group.py b/openstack/baremetal/v1/port_group.py index b2db7467f..41fd78396 100644 --- a/openstack/baremetal/v1/port_group.py +++ b/openstack/baremetal/v1/port_group.py @@ -26,7 +26,7 @@ class PortGroup(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'node', 'address', 'fields', diff --git a/openstack/clustering/v1/cluster.py b/openstack/clustering/v1/cluster.py index 8b6561ba5..8b7f12757 100644 --- a/openstack/clustering/v1/cluster.py +++ b/openstack/clustering/v1/cluster.py @@ -27,7 +27,7 @@ class Cluster(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'name', 'status', 'sort', 'global_project') diff --git a/openstack/clustering/v1/node.py b/openstack/clustering/v1/node.py index c0108df04..4147e442d 100644 --- a/openstack/clustering/v1/node.py +++ b/openstack/clustering/v1/node.py @@ -28,7 +28,7 @@ class Node(resource.Resource): allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'show_details', 'name', 'sort', 'global_project', 'cluster_id', diff --git a/openstack/clustering/v1/policy.py b/openstack/clustering/v1/policy.py index a547c7f61..f8613f291 100644 --- a/openstack/clustering/v1/policy.py +++ b/openstack/clustering/v1/policy.py @@ -27,7 +27,7 @@ class Policy(resource.Resource): allow_delete = True allow_update = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'name', 'type', 'sort', 'global_project') @@ -63,4 +63,4 @@ class PolicyValidate(Policy): allow_delete = False allow_update = False - patch_update = False + update_method = 'PUT' diff --git a/openstack/clustering/v1/profile.py b/openstack/clustering/v1/profile.py index 6420d8615..e01ebccb8 100644 --- a/openstack/clustering/v1/profile.py +++ b/openstack/clustering/v1/profile.py @@ -27,7 +27,7 @@ class Profile(resource.Resource): allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'sort', 'global_project', 'type', 'name') @@ -61,4 +61,4 @@ class ProfileValidate(Profile): allow_delete = False allow_list = False - patch_update = False + update_method = 'PUT' diff --git a/openstack/clustering/v1/receiver.py b/openstack/clustering/v1/receiver.py index 1437fce35..35265aeef 100644 --- a/openstack/clustering/v1/receiver.py +++ b/openstack/clustering/v1/receiver.py @@ -27,7 +27,7 @@ class Receiver(resource.Resource): allow_update = True allow_delete = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'name', 'type', 'cluster_id', 'action', 'sort', 'global_project', diff --git a/openstack/identity/v3/credential.py b/openstack/identity/v3/credential.py index e12794f09..33bc40c49 100644 --- a/openstack/identity/v3/credential.py +++ b/openstack/identity/v3/credential.py @@ -26,7 +26,7 @@ class Credential(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'type', 'user_id', diff --git a/openstack/identity/v3/domain.py b/openstack/identity/v3/domain.py index b6d79fd15..45b06fcbc 100644 --- a/openstack/identity/v3/domain.py +++ b/openstack/identity/v3/domain.py @@ -27,7 +27,7 @@ class Domain(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'name', diff --git a/openstack/identity/v3/endpoint.py b/openstack/identity/v3/endpoint.py index 796f3375c..59899e25e 100644 --- a/openstack/identity/v3/endpoint.py +++ b/openstack/identity/v3/endpoint.py @@ -26,7 +26,7 @@ class Endpoint(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'interface', 'service_id', diff --git a/openstack/identity/v3/group.py b/openstack/identity/v3/group.py index 12ea7e403..2793f94da 100644 --- a/openstack/identity/v3/group.py +++ b/openstack/identity/v3/group.py @@ -26,7 +26,7 @@ class Group(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'domain_id', 'name', diff --git a/openstack/identity/v3/policy.py b/openstack/identity/v3/policy.py index bd814d5ba..3e5643c70 100644 --- a/openstack/identity/v3/policy.py +++ b/openstack/identity/v3/policy.py @@ -26,7 +26,7 @@ class Policy(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' # Properties #: The policy rule set itself, as a serialized blob. *Type: string* diff --git a/openstack/identity/v3/project.py b/openstack/identity/v3/project.py index dd99b52a7..159192668 100644 --- a/openstack/identity/v3/project.py +++ b/openstack/identity/v3/project.py @@ -27,7 +27,7 @@ class Project(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'domain_id', diff --git a/openstack/identity/v3/region.py b/openstack/identity/v3/region.py index a845614b0..9169d9436 100644 --- a/openstack/identity/v3/region.py +++ b/openstack/identity/v3/region.py @@ -26,7 +26,7 @@ class Region(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'parent_region_id', diff --git a/openstack/identity/v3/service.py b/openstack/identity/v3/service.py index 79baf40a4..457d2995f 100644 --- a/openstack/identity/v3/service.py +++ b/openstack/identity/v3/service.py @@ -26,7 +26,7 @@ class Service(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'type', diff --git a/openstack/identity/v3/user.py b/openstack/identity/v3/user.py index f31154143..055a50ef8 100644 --- a/openstack/identity/v3/user.py +++ b/openstack/identity/v3/user.py @@ -26,7 +26,7 @@ class User(resource.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource.QueryParameters( 'domain_id', diff --git a/openstack/image/v2/image.py b/openstack/image/v2/image.py index 79af09ea0..f1b8a8f57 100644 --- a/openstack/image/v2/image.py +++ b/openstack/image/v2/image.py @@ -34,7 +34,7 @@ class Image(resource2.Resource): allow_update = True allow_delete = True allow_list = True - patch_update = True + update_method = 'PATCH' _query_mapping = resource2.QueryParameters("name", "visibility", "member_status", "owner", diff --git a/openstack/message/v2/claim.py b/openstack/message/v2/claim.py index 6125418de..c4824c919 100644 --- a/openstack/message/v2/claim.py +++ b/openstack/message/v2/claim.py @@ -31,7 +31,7 @@ class Claim(resource2.Resource): allow_get = True allow_update = True allow_delete = True - patch_update = True + update_method = 'PATCH' # Properties #: The value in seconds indicating how long the claim has existed. diff --git a/openstack/resource2.py b/openstack/resource2.py index 716b31604..55cdf546c 100644 --- a/openstack/resource2.py +++ b/openstack/resource2.py @@ -247,10 +247,11 @@ class Resource(object): allow_list = False #: Allow head operation for this resource. allow_head = False - #: Use PATCH for update operations on this resource. - patch_update = False - #: Use PUT for create operations on this resource. - put_create = False + + #: Method for udating a resource (PUT, PATCH, POST) + update_method = "PUT" + #: Method for creating a resource (POST, PUT) + create_method = "POST" def __init__(self, _synchronized=False, **attrs): """The base resource @@ -578,16 +579,19 @@ class Resource(object): if not self.allow_create: raise exceptions.MethodNotSupported(self, "create") - if self.put_create: + if self.create_method == 'PUT': request = self._prepare_request(requires_id=True, prepend_key=prepend_key) response = session.put(request.url, json=request.body, headers=request.headers) - else: + elif self.create_method == 'POST': request = self._prepare_request(requires_id=False, prepend_key=prepend_key) response = session.post(request.url, json=request.body, headers=request.headers) + else: + raise exceptions.ResourceFailure( + msg="Invalid create method: %s" % self.create_method) self._translate_response(response) return self @@ -661,13 +665,18 @@ class Resource(object): request = self._prepare_request(prepend_key=prepend_key) - if self.patch_update: - response = session.patch(request.url, - json=request.body, - headers=request.headers) + if self.update_method == 'PATCH': + response = session.patch( + request.url, json=request.body, headers=request.headers) + elif self.update_method == 'POST': + response = session.post( + request.url, json=request.body, headers=request.headers) + elif self.update_method == 'PUT': + response = session.put( + request.url, json=request.body, headers=request.headers) else: - response = session.put(request.url, - json=request.body, headers=request.headers) + raise exceptions.ResourceFailure( + msg="Invalid update method: %s" % self.update_method) self._translate_response(response, has_body=has_body) return self diff --git a/openstack/tests/unit/baremetal/test_version.py b/openstack/tests/unit/baremetal/test_version.py index 7466730a9..75125e216 100644 --- a/openstack/tests/unit/baremetal/test_version.py +++ b/openstack/tests/unit/baremetal/test_version.py @@ -37,8 +37,8 @@ class TestVersion(testtools.TestCase): self.assertFalse(sot.allow_delete) self.assertTrue(sot.allow_list) self.assertFalse(sot.allow_head) - self.assertFalse(sot.patch_update) - self.assertFalse(sot.put_create) + self.assertEqual('PUT', sot.update_method) + self.assertEqual('POST', sot.create_method) def test_make_it(self): sot = version.Version(**EXAMPLE) diff --git a/openstack/tests/unit/baremetal/v1/test_chassis.py b/openstack/tests/unit/baremetal/v1/test_chassis.py index b9dfe82a5..3702ba596 100644 --- a/openstack/tests/unit/baremetal/v1/test_chassis.py +++ b/openstack/tests/unit/baremetal/v1/test_chassis.py @@ -56,7 +56,7 @@ class TestChassis(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) def test_instantiate(self): sot = chassis.Chassis(**FAKE) diff --git a/openstack/tests/unit/baremetal/v1/test_node.py b/openstack/tests/unit/baremetal/v1/test_node.py index 05cff3e48..b96306111 100644 --- a/openstack/tests/unit/baremetal/v1/test_node.py +++ b/openstack/tests/unit/baremetal/v1/test_node.py @@ -104,7 +104,7 @@ class TestNode(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) def test_instantiate(self): sot = node.Node(**FAKE) diff --git a/openstack/tests/unit/baremetal/v1/test_port.py b/openstack/tests/unit/baremetal/v1/test_port.py index 29d4ad4d5..1ae202f63 100644 --- a/openstack/tests/unit/baremetal/v1/test_port.py +++ b/openstack/tests/unit/baremetal/v1/test_port.py @@ -55,7 +55,7 @@ class TestPort(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) def test_instantiate(self): sot = port.PortDetail(**FAKE) diff --git a/openstack/tests/unit/baremetal/v1/test_port_group.py b/openstack/tests/unit/baremetal/v1/test_port_group.py index b2c6ed147..d8d5abdfe 100644 --- a/openstack/tests/unit/baremetal/v1/test_port_group.py +++ b/openstack/tests/unit/baremetal/v1/test_port_group.py @@ -60,7 +60,7 @@ class TestPortGroup(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) def test_instantiate(self): sot = port_group.PortGroup(**FAKE) diff --git a/openstack/tests/unit/cluster/v1/test_profile.py b/openstack/tests/unit/cluster/v1/test_profile.py index 700382466..61de6a971 100644 --- a/openstack/tests/unit/cluster/v1/test_profile.py +++ b/openstack/tests/unit/cluster/v1/test_profile.py @@ -57,7 +57,7 @@ class TestProfile(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) def test_instantiate(self): sot = profile.Profile(**FAKE) @@ -89,4 +89,4 @@ class TestProfileValidate(testtools.TestCase): self.assertFalse(sot.allow_update) self.assertFalse(sot.allow_delete) self.assertFalse(sot.allow_list) - self.assertFalse(sot.patch_update) + self.assertEqual('PUT', sot.update_method) diff --git a/openstack/tests/unit/identity/v3/test_credential.py b/openstack/tests/unit/identity/v3/test_credential.py index 654fe7f4e..eb4c1e216 100644 --- a/openstack/tests/unit/identity/v3/test_credential.py +++ b/openstack/tests/unit/identity/v3/test_credential.py @@ -37,7 +37,7 @@ class TestCredential(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/identity/v3/test_domain.py b/openstack/tests/unit/identity/v3/test_domain.py index 80c2fbe38..6e6cb3d00 100644 --- a/openstack/tests/unit/identity/v3/test_domain.py +++ b/openstack/tests/unit/identity/v3/test_domain.py @@ -37,7 +37,7 @@ class TestDomain(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/identity/v3/test_endpoint.py b/openstack/tests/unit/identity/v3/test_endpoint.py index 3e59f71b4..115e9b7ef 100644 --- a/openstack/tests/unit/identity/v3/test_endpoint.py +++ b/openstack/tests/unit/identity/v3/test_endpoint.py @@ -39,7 +39,7 @@ class TestEndpoint(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { 'interface': 'interface', diff --git a/openstack/tests/unit/identity/v3/test_group.py b/openstack/tests/unit/identity/v3/test_group.py index 480baf8de..2051aeb3c 100644 --- a/openstack/tests/unit/identity/v3/test_group.py +++ b/openstack/tests/unit/identity/v3/test_group.py @@ -36,7 +36,7 @@ class TestGroup(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/identity/v3/test_policy.py b/openstack/tests/unit/identity/v3/test_policy.py index cdd8b71dc..b514da96e 100644 --- a/openstack/tests/unit/identity/v3/test_policy.py +++ b/openstack/tests/unit/identity/v3/test_policy.py @@ -38,7 +38,7 @@ class TestPolicy(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) def test_make_it(self): sot = policy.Policy(**EXAMPLE) diff --git a/openstack/tests/unit/identity/v3/test_project.py b/openstack/tests/unit/identity/v3/test_project.py index 8e6998faa..fc5ecd806 100644 --- a/openstack/tests/unit/identity/v3/test_project.py +++ b/openstack/tests/unit/identity/v3/test_project.py @@ -39,7 +39,7 @@ class TestProject(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/identity/v3/test_region.py b/openstack/tests/unit/identity/v3/test_region.py index 9ee14e082..cf7841683 100644 --- a/openstack/tests/unit/identity/v3/test_region.py +++ b/openstack/tests/unit/identity/v3/test_region.py @@ -36,7 +36,7 @@ class TestRegion(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/identity/v3/test_service.py b/openstack/tests/unit/identity/v3/test_service.py index 578b5f656..be321a22a 100644 --- a/openstack/tests/unit/identity/v3/test_service.py +++ b/openstack/tests/unit/identity/v3/test_service.py @@ -38,7 +38,7 @@ class TestService(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/identity/v3/test_user.py b/openstack/tests/unit/identity/v3/test_user.py index e0cbb369d..1f746d111 100644 --- a/openstack/tests/unit/identity/v3/test_user.py +++ b/openstack/tests/unit/identity/v3/test_user.py @@ -42,7 +42,7 @@ class TestUser(testtools.TestCase): self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) - self.assertTrue(sot.patch_update) + self.assertEqual('PATCH', sot.update_method) self.assertDictEqual( { diff --git a/openstack/tests/unit/test_resource.py b/openstack/tests/unit/test_resource.py index 2364920b2..daf5f4643 100644 --- a/openstack/tests/unit/test_resource.py +++ b/openstack/tests/unit/test_resource.py @@ -783,7 +783,7 @@ class ResourceTests(base.TestCase): def test_put_update(self): class FakeResourcePut(FakeResource): # This is False by default, but explicit for this test. - patch_update = False + update_method = 'PUT' resp = FakeResponse(fake_body, headers={'location': 'foo'}) self.session.put = mock.Mock(return_value=resp) diff --git a/openstack/tests/unit/test_resource2.py b/openstack/tests/unit/test_resource2.py index a69b88dc0..4a8b845b6 100644 --- a/openstack/tests/unit/test_resource2.py +++ b/openstack/tests/unit/test_resource2.py @@ -424,8 +424,8 @@ class TestResource(base.TestCase): self.assertFalse(sot.allow_delete) self.assertFalse(sot.allow_list) self.assertFalse(sot.allow_head) - self.assertFalse(sot.patch_update) - self.assertFalse(sot.put_create) + self.assertEqual('PUT', sot.update_method) + self.assertEqual('POST', sot.create_method) def test_repr(self): a = {"a": 1} @@ -995,7 +995,7 @@ class TestResourceActions(base.TestCase): service = self.service_name base_path = self.base_path allow_create = True - put_create = True + create_method = 'PUT' self._test_create(Test, requires_id=True, prepend_key=True) @@ -1004,7 +1004,7 @@ class TestResourceActions(base.TestCase): service = self.service_name base_path = self.base_path allow_create = True - put_create = False + create_method = 'POST' self._test_create(Test, requires_id=False, prepend_key=True) @@ -1039,9 +1039,9 @@ class TestResourceActions(base.TestCase): self.sot._translate_response.assert_called_once_with(self.response) self.assertEqual(result, self.sot) - def _test_update(self, patch_update=False, prepend_key=True, + def _test_update(self, update_method='PUT', prepend_key=True, has_body=True): - self.sot.patch_update = patch_update + self.sot.update_method = update_method # Need to make sot look dirty so we can attempt an update self.sot._body = mock.Mock() @@ -1053,11 +1053,15 @@ class TestResourceActions(base.TestCase): self.sot._prepare_request.assert_called_once_with( prepend_key=prepend_key) - if patch_update: + if update_method == 'PATCH': self.session.patch.assert_called_once_with( self.request.url, json=self.request.body, headers=self.request.headers) - else: + elif update_method == 'POST': + self.session.post.assert_called_once_with( + self.request.url, + json=self.request.body, headers=self.request.headers) + elif update_method == 'PUT': self.session.put.assert_called_once_with( self.request.url, json=self.request.body, headers=self.request.headers) @@ -1066,10 +1070,11 @@ class TestResourceActions(base.TestCase): self.response, has_body=has_body) def test_update_put(self): - self._test_update(patch_update=False, prepend_key=True, has_body=True) + self._test_update(update_method='PUT', prepend_key=True, has_body=True) def test_update_patch(self): - self._test_update(patch_update=True, prepend_key=False, has_body=False) + self._test_update( + update_method='PATCH', prepend_key=False, has_body=False) def test_update_not_dirty(self): self.sot._body = mock.Mock()