Change update/create method options

Rather than use booleans, switch to explicit definition of
which method is used. This is useful because 'update' can
when including Swift be 3 different methods, and that gets
messy with booleans. An explicit definition works nicer
and gives us more flexibility in future as well as a nicer
pattern for similar method remappings.

Depends-On: Icfa811571ec7c26617e0f8e9db086001fc0bc81f
Change-Id: I7e231a8c89ffd74fdd63aabafb408fadfdb69c67
This commit is contained in:
Adrian Turjak 2018-01-15 14:08:24 +13:00 committed by Monty Taylor
parent 8daa33e384
commit 26732e8374
No known key found for this signature in database
GPG Key ID: 7BAE94BC7141A594
38 changed files with 76 additions and 62 deletions

View File

@ -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'

View File

@ -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',

View File

@ -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'

View File

@ -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',

View File

@ -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')

View File

@ -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',

View File

@ -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'

View File

@ -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'

View File

@ -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',

View File

@ -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',

View File

@ -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',

View File

@ -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',

View File

@ -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',

View File

@ -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*

View File

@ -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',

View File

@ -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',

View File

@ -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',

View File

@ -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',

View File

@ -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",

View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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(
{

View File

@ -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(
{

View File

@ -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',

View File

@ -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(
{

View File

@ -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)

View File

@ -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(
{

View File

@ -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(
{

View File

@ -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(
{

View File

@ -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(
{

View File

@ -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)

View File

@ -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()