Ensure APIv2 list respose formats are correct
Change-Id: Ie090dd7344173c4369bf321e9be951252eddba42 Closes-Bug: 1269463
This commit is contained in:
parent
4e35786df8
commit
9c8c431b8f
designate
api/v2
controllers
views
tests/test_api/test_v2
@ -73,7 +73,7 @@ class FloatingIPController(rest.RestController):
|
||||
context, region, id_, body['floatingip'])
|
||||
|
||||
if fip:
|
||||
return self._view.basic(context, request, fip)
|
||||
return self._view.show(context, request, fip)
|
||||
|
||||
@pecan.expose(template='json:', content_type='application/json')
|
||||
def get_one(self, fip_key):
|
||||
@ -87,4 +87,4 @@ class FloatingIPController(rest.RestController):
|
||||
|
||||
fip = central_api.get_floatingip(context, region, id_)
|
||||
|
||||
return self._view.basic(context, request, fip)
|
||||
return self._view.show(context, request, fip)
|
||||
|
@ -34,4 +34,4 @@ class LimitsController(rest.RestController):
|
||||
|
||||
absolute_limits = central_api.get_absolute_limits(context)
|
||||
|
||||
return self._view.basic(context, request, absolute_limits)
|
||||
return self._view.show(context, request, absolute_limits)
|
||||
|
@ -41,7 +41,7 @@ class RecordsController(rest.RestController):
|
||||
record = central_api.get_record(context, zone_id, recordset_id,
|
||||
record_id)
|
||||
|
||||
return self._view.detail(context, request, record)
|
||||
return self._view.show(context, request, record)
|
||||
|
||||
@pecan.expose(template='json:', content_type='application/json')
|
||||
def get_all(self, zone_id, recordset_id, **params):
|
||||
@ -95,7 +95,7 @@ class RecordsController(rest.RestController):
|
||||
request, record, [zone_id, recordset_id])
|
||||
|
||||
# Prepare and return the response body
|
||||
return self._view.detail(context, request, record)
|
||||
return self._view.show(context, request, record)
|
||||
|
||||
@pecan.expose(template='json:', content_type='application/json')
|
||||
@pecan.expose(template='json:', content_type='application/json-patch+json')
|
||||
@ -114,7 +114,7 @@ class RecordsController(rest.RestController):
|
||||
record_id)
|
||||
|
||||
# Convert to APIv2 Format
|
||||
record = self._view.detail(context, request, record)
|
||||
record = self._view.show(context, request, record)
|
||||
|
||||
if request.content_type == 'application/json-patch+json':
|
||||
raise NotImplemented('json-patch not implemented')
|
||||
@ -133,7 +133,7 @@ class RecordsController(rest.RestController):
|
||||
else:
|
||||
response.status_int = 200
|
||||
|
||||
return self._view.detail(context, request, record)
|
||||
return self._view.show(context, request, record)
|
||||
|
||||
@pecan.expose(template=None, content_type='application/json')
|
||||
def delete_one(self, zone_id, recordset_id, record_id):
|
||||
|
@ -43,7 +43,7 @@ class RecordSetsController(rest.RestController):
|
||||
|
||||
recordset = central_api.get_recordset(context, zone_id, recordset_id)
|
||||
|
||||
return self._view.detail(context, request, recordset)
|
||||
return self._view.show(context, request, recordset)
|
||||
|
||||
@pecan.expose(template='json:', content_type='application/json')
|
||||
def get_all(self, zone_id, **params):
|
||||
@ -90,7 +90,7 @@ class RecordSetsController(rest.RestController):
|
||||
request, recordset, [zone_id])
|
||||
|
||||
# Prepare and return the response body
|
||||
return self._view.detail(context, request, recordset)
|
||||
return self._view.show(context, request, recordset)
|
||||
|
||||
@pecan.expose(template='json:', content_type='application/json')
|
||||
@pecan.expose(template='json:', content_type='application/json-patch+json')
|
||||
@ -108,7 +108,7 @@ class RecordSetsController(rest.RestController):
|
||||
recordset = central_api.get_recordset(context, zone_id, recordset_id)
|
||||
|
||||
# Convert to APIv2 Format
|
||||
recordset = self._view.detail(context, request, recordset)
|
||||
recordset = self._view.show(context, request, recordset)
|
||||
|
||||
if request.content_type == 'application/json-patch+json':
|
||||
raise NotImplemented('json-patch not implemented')
|
||||
@ -124,7 +124,7 @@ class RecordSetsController(rest.RestController):
|
||||
|
||||
response.status_int = 200
|
||||
|
||||
return self._view.detail(context, request, recordset)
|
||||
return self._view.show(context, request, recordset)
|
||||
|
||||
@pecan.expose(template=None, content_type='application/json')
|
||||
def delete_one(self, zone_id, recordset_id):
|
||||
|
@ -61,7 +61,7 @@ class ZonesController(rest.RestController):
|
||||
""" 'Normal' zone get """
|
||||
zone = central_api.get_domain(context, zone_id)
|
||||
|
||||
return self._view.detail(context, request, zone)
|
||||
return self._view.show(context, request, zone)
|
||||
|
||||
def _get_zonefile(self, request, context, zone_id):
|
||||
""" Export zonefile """
|
||||
@ -153,7 +153,7 @@ class ZonesController(rest.RestController):
|
||||
zone)
|
||||
|
||||
# Prepare and return the response body
|
||||
return self._view.detail(context, request, zone)
|
||||
return self._view.show(context, request, zone)
|
||||
|
||||
def _post_zonefile(self, request, response, context):
|
||||
""" Import Zone """
|
||||
@ -174,7 +174,7 @@ class ZonesController(rest.RestController):
|
||||
|
||||
response.headers['Location'] = self._view._get_resource_href(request,
|
||||
zone)
|
||||
return self._view.detail(context, request, zone)
|
||||
return self._view.show(context, request, zone)
|
||||
|
||||
@pecan.expose(template='json:', content_type='application/json')
|
||||
@pecan.expose(template='json:', content_type='application/json-patch+json')
|
||||
@ -192,7 +192,7 @@ class ZonesController(rest.RestController):
|
||||
zone = central_api.get_domain(context, zone_id)
|
||||
|
||||
# Convert to APIv2 Format
|
||||
zone = self._view.detail(context, request, zone)
|
||||
zone = self._view.show(context, request, zone)
|
||||
|
||||
if request.content_type == 'application/json-patch+json':
|
||||
# Possible pattern:
|
||||
@ -222,7 +222,7 @@ class ZonesController(rest.RestController):
|
||||
else:
|
||||
response.status_int = 200
|
||||
|
||||
return self._view.detail(context, request, zone)
|
||||
return self._view.show(context, request, zone)
|
||||
|
||||
@pecan.expose(template=None, content_type='application/json')
|
||||
def delete_one(self, zone_id):
|
||||
|
@ -55,21 +55,34 @@ class BaseView(object):
|
||||
|
||||
return result
|
||||
|
||||
def list_detail(self, context, request, items):
|
||||
""" Detailed list of items """
|
||||
return [self.detail(context, request, i) for i in items]
|
||||
|
||||
def list_basic(self, context, request, items):
|
||||
""" Non-detailed list of items """
|
||||
return [self.basic(context, request, i) for i in items]
|
||||
return [self.show_basic(context, request, i) for i in items]
|
||||
|
||||
def basic(self, context, request, item):
|
||||
def list_detail(self, context, request, items):
|
||||
""" Detailed list of items """
|
||||
return [self.show_detail(context, request, i) for i in items]
|
||||
|
||||
def show(self, context, request, item):
|
||||
""" Show a single item """
|
||||
result = {}
|
||||
|
||||
if 'detail' in request.GET and request.GET['detail'] == 'yes':
|
||||
result[self._resource_name] = self.show_detail(context, request,
|
||||
item)
|
||||
else:
|
||||
result[self._resource_name] = self.show_basic(context, request,
|
||||
item)
|
||||
|
||||
return result
|
||||
|
||||
def show_basic(self, context, request, item):
|
||||
""" Non-detailed view of a item """
|
||||
raise NotImplementedError()
|
||||
|
||||
def detail(self, context, request, item):
|
||||
def show_detail(self, context, request, item):
|
||||
""" Detailed view of a item """
|
||||
return self.basic(context, request, item)
|
||||
return self.show_basic(context, request, item)
|
||||
|
||||
def _get_resource_links(self, request, item, parents=None):
|
||||
return {
|
||||
|
@ -28,9 +28,8 @@ class FloatingIPView(base_view.BaseView):
|
||||
def _get_base_href(self, parents=None):
|
||||
return '%s/reverse/floatingips' % self.base_uri
|
||||
|
||||
def basic(self, context, request, data):
|
||||
data['id'] = ":".join([data.pop('region'), data.pop('id')])
|
||||
data['links'] = self._get_resource_links(
|
||||
request, data, [data['id']])
|
||||
return {
|
||||
'floatingip': data}
|
||||
def show_basic(self, context, request, item):
|
||||
item['id'] = ":".join([item.pop('region'), item.pop('id')])
|
||||
item['links'] = self._get_resource_links(
|
||||
request, item, [item['id']])
|
||||
return item
|
||||
|
@ -23,17 +23,15 @@ LOG = logging.getLogger(__name__)
|
||||
class LimitsView(base_view.BaseView):
|
||||
""" Model a Limits API response as a python dictionary """
|
||||
|
||||
_resource_name = 'limit'
|
||||
_resource_name = 'limits'
|
||||
_collection_name = 'limits'
|
||||
|
||||
def basic(self, context, request, absolute_limits):
|
||||
def show_basic(self, context, request, absolute_limits):
|
||||
""" Basic view of the limits """
|
||||
|
||||
return {
|
||||
"limits": {
|
||||
"absolute": {
|
||||
"maxZones": absolute_limits['domains'],
|
||||
"maxZoneRecords": absolute_limits['domain_records']
|
||||
}
|
||||
"absolute": {
|
||||
"maxZones": absolute_limits['domains'],
|
||||
"maxZoneRecords": absolute_limits['domain_records']
|
||||
}
|
||||
}
|
||||
|
@ -35,21 +35,19 @@ class RecordsView(base_view.BaseView):
|
||||
|
||||
return href.rstrip('?')
|
||||
|
||||
def basic(self, context, request, record):
|
||||
def show_basic(self, context, request, record):
|
||||
""" Basic view of a record """
|
||||
return {
|
||||
"record": {
|
||||
"id": record['id'],
|
||||
"recordset_id": record['recordset_id'],
|
||||
"data": record['data'],
|
||||
"description": record['description'],
|
||||
"version": record['version'],
|
||||
"created_at": record['created_at'],
|
||||
"updated_at": record['updated_at'],
|
||||
"links": self._get_resource_links(
|
||||
request, record,
|
||||
[record['domain_id'], record['recordset_id']])
|
||||
}
|
||||
"id": record['id'],
|
||||
"recordset_id": record['recordset_id'],
|
||||
"data": record['data'],
|
||||
"description": record['description'],
|
||||
"version": record['version'],
|
||||
"created_at": record['created_at'],
|
||||
"updated_at": record['updated_at'],
|
||||
"links": self._get_resource_links(
|
||||
request, record,
|
||||
[record['domain_id'], record['recordset_id']])
|
||||
}
|
||||
|
||||
def load(self, context, request, body):
|
||||
|
@ -33,22 +33,20 @@ class RecordSetsView(base_view.BaseView):
|
||||
|
||||
return href.rstrip('?')
|
||||
|
||||
def basic(self, context, request, recordset):
|
||||
def show_basic(self, context, request, recordset):
|
||||
""" Basic view of a recordset """
|
||||
return {
|
||||
"recordset": {
|
||||
"id": recordset['id'],
|
||||
"zone_id": recordset['domain_id'],
|
||||
"name": recordset['name'],
|
||||
"type": recordset['type'],
|
||||
"ttl": recordset['ttl'],
|
||||
"description": recordset['description'],
|
||||
"version": recordset['version'],
|
||||
"created_at": recordset['created_at'],
|
||||
"updated_at": recordset['updated_at'],
|
||||
"links": self._get_resource_links(request, recordset,
|
||||
[recordset['domain_id']])
|
||||
}
|
||||
"id": recordset['id'],
|
||||
"zone_id": recordset['domain_id'],
|
||||
"name": recordset['name'],
|
||||
"type": recordset['type'],
|
||||
"ttl": recordset['ttl'],
|
||||
"description": recordset['description'],
|
||||
"version": recordset['version'],
|
||||
"created_at": recordset['created_at'],
|
||||
"updated_at": recordset['updated_at'],
|
||||
"links": self._get_resource_links(request, recordset,
|
||||
[recordset['domain_id']])
|
||||
}
|
||||
|
||||
def load(self, context, request, body):
|
||||
|
@ -26,25 +26,23 @@ class ZonesView(base_view.BaseView):
|
||||
_resource_name = 'zone'
|
||||
_collection_name = 'zones'
|
||||
|
||||
def basic(self, context, request, zone):
|
||||
def show_basic(self, context, request, zone):
|
||||
""" Basic view of a zone """
|
||||
# TODO(kiall): pool_id should not be hardcoded.. even temp :)
|
||||
return {
|
||||
"zone": {
|
||||
"id": zone['id'],
|
||||
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
|
||||
"project_id": zone['tenant_id'],
|
||||
"name": zone['name'],
|
||||
"email": zone['email'],
|
||||
"description": zone['description'],
|
||||
"ttl": zone['ttl'],
|
||||
"serial": zone['serial'],
|
||||
"status": zone['status'],
|
||||
"version": zone['version'],
|
||||
"created_at": zone['created_at'],
|
||||
"updated_at": zone['updated_at'],
|
||||
"links": self._get_resource_links(request, zone)
|
||||
}
|
||||
"id": zone['id'],
|
||||
"pool_id": "572ba08c-d929-4c70-8e42-03824bb24ca2",
|
||||
"project_id": zone['tenant_id'],
|
||||
"name": zone['name'],
|
||||
"email": zone['email'],
|
||||
"description": zone['description'],
|
||||
"ttl": zone['ttl'],
|
||||
"serial": zone['serial'],
|
||||
"status": zone['status'],
|
||||
"version": zone['version'],
|
||||
"created_at": zone['created_at'],
|
||||
"updated_at": zone['updated_at'],
|
||||
"links": self._get_resource_links(request, zone)
|
||||
}
|
||||
|
||||
def load(self, context, request, body):
|
||||
|
@ -108,8 +108,7 @@ class ApiV2ReverseFloatingIPTest(ApiV2TestCase):
|
||||
self.assertIn('links', response.json)
|
||||
self.assertEqual(1, len(response.json['floatingips']))
|
||||
|
||||
#TODO(ekarlso): Remove the floatingip key - bug in v2 api
|
||||
fip_record = response.json['floatingips'][0]['floatingip']
|
||||
fip_record = response.json['floatingips'][0]
|
||||
self.assertEqual(None, fip_record['ptrdname'])
|
||||
self.assertEqual(":".join([fip['region'], fip['id']]),
|
||||
fip_record['id'])
|
||||
@ -136,8 +135,7 @@ class ApiV2ReverseFloatingIPTest(ApiV2TestCase):
|
||||
self.assertIn('links', response.json)
|
||||
self.assertEqual(1, len(response.json['floatingips']))
|
||||
|
||||
#TODO(ekarlso): Remove the floatingip key - bug in v2 api
|
||||
fip_record = response.json['floatingips'][0]['floatingip']
|
||||
fip_record = response.json['floatingips'][0]
|
||||
self.assertEqual(fixture['ptrdname'], fip_record['ptrdname'])
|
||||
self.assertEqual(":".join([fip['region'], fip['id']]),
|
||||
fip_record['id'])
|
||||
|
Loading…
x
Reference in New Issue
Block a user