Ensure APIv2 list respose formats are correct

Change-Id: Ie090dd7344173c4369bf321e9be951252eddba42
Closes-Bug: 1269463
This commit is contained in:
Kiall Mac Innes 2014-01-15 15:27:03 +00:00
parent 4e35786df8
commit 9c8c431b8f
12 changed files with 86 additions and 84 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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