API: add node output and improve error handling

Change-Id: I3e32ab768115e6d92403373f454926fe3b90e3c1
This commit is contained in:
Andrew Hutchings 2013-05-17 13:32:22 +01:00
parent 2d5e949be6
commit 14363b4082
6 changed files with 64 additions and 20 deletions

View File

@ -27,7 +27,7 @@ app = {
'template_path': '%(confdir)s/api/templates',
'debug': True,
'errors': {
404: '/error/404',
404: '/notfound',
'__force_dict__': True
}
}

View File

@ -111,8 +111,13 @@ class LoadBalancersController(RestController):
).join(LoadBalancer.devices).\
filter(LoadBalancer.tenantid == tenant_id).\
filter(LoadBalancer.id == load_balancer_id).\
first()._asdict()
first()
if not load_balancers:
response.status = 400
return dict(status=400, message="load balancer not found")
load_balancers = load_balancers._asdict()
virtualIps = session.query(
Device.id, Device.floatingIpAddr
).join(LoadBalancer.devices).\
@ -144,12 +149,8 @@ class LoadBalancersController(RestController):
del node['enabled']
load_balancers['nodes'].append(node)
if load_balancers is None:
response.status = 400
return Responses.not_found
else:
response.status = 200
return load_balancers
response.status = 200
return load_balancers
@expose('json')
def post(self, load_balancer_id=None, **kwargs):

View File

@ -16,7 +16,7 @@
from pecan import expose, response
from pecan.rest import RestController
#default response objects
#from libra.api.model.lbaas import Device, LoadBalancer, Node, session
from libra.api.model.lbaas import LoadBalancer, Node, session
from libra.api.model.responses import Responses
@ -37,8 +37,45 @@ class NodesController(RestController):
Returns: dict
"""
response.status = 201
return Responses.LoadBalancers.Nodes.get
tenant_id = 80074562416143
if not load_balancer_id:
response.status = 400
return dict(status=400, message='load balancer ID not supplied')
if not node_id:
nodes = session.query(
Node.id, Node.address, Node.port, Node.status, Node.enabled
).join(LoadBalancer.nodes).\
filter(LoadBalancer.tenantid == tenant_id).\
filter(LoadBalancer.id == load_balancer_id).\
all()
node_response = {'nodes': []}
for item in nodes:
node = item._asdict()
if node['enabled'] == 1:
node['condition'] = 'ENABLED'
else:
node['condition'] = 'DISABLED'
del node['enabled']
node_response['nodes'].append(node)
else:
node_response = session.query(
Node.id, Node.address, Node.port, Node.status, Node.enabled
).join(LoadBalancer.nodes).\
filter(LoadBalancer.tenantid == tenant_id).\
filter(LoadBalancer.id == load_balancer_id).\
filter(Node.id == node_id).\
first()
if node_response is None:
response.status = 400
return dict(status=400, message='node not found')
else:
response.status = 200
return node_response
@expose('json')
def post(self, load_balancer_id, node_id=None, *args):

View File

@ -25,7 +25,11 @@ class RootController(object):
def _default(self):
"""default route.. acts as catch all for any wrong urls.
For now it returns a 404 because no action is defined for /"""
response.status = 201
response.status = 404
return Responses._default
@expose('json')
def notfound(self):
return Responses._default
@expose('json')
@ -37,7 +41,7 @@ class RootController(object):
Returns: dict
"""
response.status = 201
response.status = 200
return Responses.protocols
@expose('json')
@ -49,7 +53,7 @@ class RootController(object):
Returns: dict
"""
response.status = 201
response.status = 200
return Responses.algorithms
#pecan uses this controller class for urls that start with /loadbalancers

View File

@ -20,7 +20,7 @@ responder objects for framework.
class Responses(object):
"""404 - not found"""
_default = {'status': '404'}
_default = {'status': '404', 'message': 'Object not Found'}
"""not found """
not_found = {'message': 'Object not Found'}

View File

@ -20,17 +20,19 @@ from libra.api.tests import FunctionalTest
class TestRootController(FunctionalTest):
def test_get(self):
response = self.app.get('/')
assert response.status_int == 201
response = self.app.get('/', expect_errors=True)
assert response.status_int == 404
def test_search(self):
response = self.app.post('/', params={'q': 'RestController'})
assert response.status_int == 201
# Lets get post sorted before enabling this
# response = self.app.post('/', params={'q': 'RestController'})
# assert response.status_int == 201
# assert response.headers['Location'] == (
# 'http://pecan.readthedocs.org/en/latest/search.html'
# '?q=RestController'
# )
pass
def test_get_not_found(self):
response = self.app.get('/a/bogus/url', expect_errors=True)
# assert response.status_int == 400
assert response.status_int == 404