diff --git a/etc/libra_api.py b/etc/libra_api.py index 09be9e8a..0255be5a 100644 --- a/etc/libra_api.py +++ b/etc/libra_api.py @@ -27,7 +27,7 @@ app = { 'template_path': '%(confdir)s/api/templates', 'debug': True, 'errors': { - 404: '/error/404', + 404: '/notfound', '__force_dict__': True } } diff --git a/libra/api/controllers/load_balancers.py b/libra/api/controllers/load_balancers.py index 45ed9caf..3db2d98b 100644 --- a/libra/api/controllers/load_balancers.py +++ b/libra/api/controllers/load_balancers.py @@ -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): diff --git a/libra/api/controllers/nodes.py b/libra/api/controllers/nodes.py index b8798f15..b959c04f 100644 --- a/libra/api/controllers/nodes.py +++ b/libra/api/controllers/nodes.py @@ -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): diff --git a/libra/api/controllers/root.py b/libra/api/controllers/root.py index 44c02d83..e6179091 100644 --- a/libra/api/controllers/root.py +++ b/libra/api/controllers/root.py @@ -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 diff --git a/libra/api/model/responses.py b/libra/api/model/responses.py index 4da48f51..adafda5e 100644 --- a/libra/api/model/responses.py +++ b/libra/api/model/responses.py @@ -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'} diff --git a/libra/api/tests/test_functional.py b/libra/api/tests/test_functional.py index f9b69880..43d64e34 100644 --- a/libra/api/tests/test_functional.py +++ b/libra/api/tests/test_functional.py @@ -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