Fix and clean up codes at service api
Change-Id: Ib5da1f5e4ab0b21647a7931ef7b237d61e89a22c
This commit is contained in:
parent
7ac1bd8609
commit
80ee0fa9be
|
@ -36,28 +36,27 @@ class ServicePatchType(types.JsonPatchType):
|
|||
|
||||
@staticmethod
|
||||
def mandatory_attrs():
|
||||
return ['/service_uuid']
|
||||
return ['/bay_uuid']
|
||||
|
||||
|
||||
class Service(base.APIBase):
|
||||
_service_uuid = None
|
||||
_bay_uuid = None
|
||||
|
||||
def _get_service_uuid(self):
|
||||
return self._service_uuid
|
||||
def _get_bay_uuid(self):
|
||||
return self._bay_uuid
|
||||
|
||||
def _set_service_uuid(self, value):
|
||||
if value and self._service_uuid != value:
|
||||
def _set_bay_uuid(self, value):
|
||||
if value and self._bay_uuid != value:
|
||||
try:
|
||||
service = objects.Service.get(pecan.request.context, value)
|
||||
self._service_uuid = service.uuid
|
||||
self.service_id = service.id
|
||||
except exception.ServiceNotFound as e:
|
||||
bay = objects.Bay.get(pecan.request.context, value)
|
||||
self._bay_uuid = bay.uuid
|
||||
except exception.BayNotFound as e:
|
||||
# Change error code because 404 (NotFound) is inappropriate
|
||||
# response for a POST request to create a Service
|
||||
e.code = 400 # BadRequest
|
||||
raise e
|
||||
elif value == wtypes.Unset:
|
||||
self._service_uuid = wtypes.Unset
|
||||
self._bay_uuid = wtypes.Unset
|
||||
|
||||
uuid = types.uuid
|
||||
"""Unique UUID for this service"""
|
||||
|
@ -65,7 +64,8 @@ class Service(base.APIBase):
|
|||
name = wsme.wsattr(wtypes.text, readonly=True)
|
||||
""" The name of the service."""
|
||||
|
||||
bay_uuid = types.uuid
|
||||
bay_uuid = wsme.wsproperty(types.uuid, _get_bay_uuid, _set_bay_uuid,
|
||||
mandatory=True)
|
||||
"""Unique UUID of the bay the service runs on"""
|
||||
|
||||
labels = wsme.wsattr({wtypes.text: wtypes.text}, readonly=True)
|
||||
|
@ -93,25 +93,18 @@ class Service(base.APIBase):
|
|||
super(Service, self).__init__()
|
||||
|
||||
self.fields = []
|
||||
fields = list(objects.Service.fields)
|
||||
fields.append('service_uuid')
|
||||
for field in fields:
|
||||
for field in objects.Service.fields:
|
||||
# Skip fields we do not expose.
|
||||
if not hasattr(self, field):
|
||||
continue
|
||||
self.fields.append(field)
|
||||
setattr(self, field, kwargs.get(field, wtypes.Unset))
|
||||
|
||||
self.fields.append('service_id')
|
||||
setattr(self, 'service_uuid', kwargs.get('service_id', wtypes.Unset))
|
||||
|
||||
@staticmethod
|
||||
def _convert_with_links(service, url, expand=True):
|
||||
if not expand:
|
||||
service.unset_fields_except(['uuid', 'name', 'bay_uuid', 'labels',
|
||||
'selector', 'ip', 'port'])
|
||||
# never expose the service_id attribute
|
||||
service.service_id = wtypes.Unset
|
||||
|
||||
service.links = [link.Link.make_link('self', url,
|
||||
'services', service.uuid),
|
||||
|
@ -135,9 +128,21 @@ class Service(base.APIBase):
|
|||
selector={'label1': 'foo'},
|
||||
ip='172.17.2.2',
|
||||
port=80,
|
||||
manifest_url='file:///tmp/rc.yaml',
|
||||
manifest='''{
|
||||
"id": "service_foo",
|
||||
"kind": "Service",
|
||||
"apiVersion": "v1beta1",
|
||||
"port": 88,
|
||||
"selector": {
|
||||
"bar": "foo"
|
||||
},
|
||||
"labels": {
|
||||
"bar": "foo"
|
||||
}
|
||||
}''',
|
||||
created_at=datetime.datetime.utcnow(),
|
||||
updated_at=datetime.datetime.utcnow())
|
||||
sample._service_uuid = '87504bd9-ca50-40fd-b14e-bcb23ed42b27'
|
||||
return cls._convert_with_links(sample, 'http://localhost:9511', expand)
|
||||
|
||||
def parse_manifest(self):
|
||||
|
@ -300,11 +305,6 @@ class ServicesController(rest.RestController):
|
|||
service_uuid)
|
||||
try:
|
||||
service_dict = rpc_service.as_dict()
|
||||
# NOTE(lucasagomes):
|
||||
# 1) Remove service_id because it's an internal value and
|
||||
# not present in the API object
|
||||
# 2) Add service_uuid
|
||||
service_dict['service_uuid'] = service_dict.pop('service_id', None)
|
||||
service = Service(**api_utils.apply_jsonpatch(service_dict, patch))
|
||||
except api_utils.JSONPATCH_EXCEPTIONS as e:
|
||||
raise exception.PatchError(patch=patch, reason=e)
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
from magnum.conductor import api
|
||||
from magnum import objects
|
||||
from magnum.tests.db import base as db_base
|
||||
from magnum.tests.db import utils as db_utils
|
||||
|
||||
from mock import patch
|
||||
|
||||
|
@ -29,10 +30,13 @@ class TestServiceController(db_base.DbTestCase):
|
|||
def test_service_api(self):
|
||||
with patch.object(api.API, 'service_create') as mock_method:
|
||||
mock_method.side_effect = self.mock_service_create
|
||||
# Create a bay
|
||||
bay = db_utils.create_test_bay()
|
||||
|
||||
# Create a service
|
||||
params = '''
|
||||
{
|
||||
"bay_uuid": "7ae81bb3-dec3-4289-8d6c-da80bd8001ae",
|
||||
"bay_uuid": "%s",
|
||||
"manifest": "\
|
||||
{\
|
||||
\\"id\\": \\"service_foo\\",\
|
||||
|
@ -48,7 +52,7 @@ class TestServiceController(db_base.DbTestCase):
|
|||
}\
|
||||
\"
|
||||
}
|
||||
'''
|
||||
''' % bay.uuid
|
||||
response = self.app.post('/v1/services',
|
||||
params=params,
|
||||
content_type='application/json')
|
||||
|
@ -60,8 +64,7 @@ class TestServiceController(db_base.DbTestCase):
|
|||
c = response.json['services'][0]
|
||||
self.assertIsNotNone(c.get('uuid'))
|
||||
self.assertEqual('service_foo', c.get('name'))
|
||||
self.assertEqual('7ae81bb3-dec3-4289-8d6c-da80bd8001ae',
|
||||
c.get('bay_uuid'))
|
||||
self.assertEqual(bay.uuid, c.get('bay_uuid'))
|
||||
self.assertEqual('foo', c.get('labels')['bar'])
|
||||
self.assertEqual('foo', c.get('selector')['bar'])
|
||||
self.assertEqual(88, c.get('port'))
|
||||
|
|
Loading…
Reference in New Issue