diff options
| author | Kevin L. Mitchell <kevin.mitchell@rackspace.com> | 2011-07-08 13:06:37 -0500 |
|---|---|---|
| committer | Kevin L. Mitchell <kevin.mitchell@rackspace.com> | 2011-07-08 13:06:37 -0500 |
| commit | 921fee22ff42852b1ee0d7f3d051b44d60afd975 (patch) | |
| tree | 753a5a39b54d34fd298b7bf489b2525a6201012f | |
| parent | e7bc748edef30b106628946eeda36818aac4fe9d (diff) | |
Add support for remove_fixed_ip()
| -rw-r--r-- | nova/api/openstack/contrib/multinic.py | 20 | ||||
| -rw-r--r-- | nova/tests/api/openstack/contrib/test_multinic_xs.py | 35 |
2 files changed, 50 insertions, 5 deletions
diff --git a/nova/api/openstack/contrib/multinic.py b/nova/api/openstack/contrib/multinic.py index 164af79b0..e202bd51c 100644 --- a/nova/api/openstack/contrib/multinic.py +++ b/nova/api/openstack/contrib/multinic.py @@ -26,6 +26,8 @@ from nova.api.openstack import faults LOG = logging.getLogger("nova.api.multinic") +# Note: The class name is as it has to be for this to be loaded as an +# extension--only first character capitalized. class Multinic(extensions.ExtensionDescriptor): def __init__(self, *args, **kwargs): super(Multinic, self).__init__(*args, **kwargs) @@ -79,5 +81,19 @@ class Multinic(extensions.ExtensionDescriptor): return exc.HTTPAccepted() def _remove_fixed_ip(self, input_dict, req, id): - # Not yet implemented - raise faults.Fault(exc.HTTPNotImplemented()) + """Removes an IP from an instance.""" + try: + # Validate the input entity + if 'address' not in input_dict['removeFixedIp']: + LOG.exception(_("Missing 'address' argument for " + "removeFixedIp")) + return faults.Fault(exc.HTTPUnprocessableEntity()) + + # Remove the fixed IP + address = input_dict['removeFixedIp']['address'] + self.compute_api.remove_fixed_ip(req.environ['nova.context'], id, + address) + except Exception, e: + LOG.exception(_("Error in removeFixedIp %s"), e) + return faults.Fault(exc.HTTPBadRequest()) + return exc.HTTPAccepted() diff --git a/nova/tests/api/openstack/contrib/test_multinic_xs.py b/nova/tests/api/openstack/contrib/test_multinic_xs.py index e531435a0..b9f4456bb 100644 --- a/nova/tests/api/openstack/contrib/test_multinic_xs.py +++ b/nova/tests/api/openstack/contrib/test_multinic_xs.py @@ -1,4 +1,4 @@ -# Copyright 2011 Eldar Nugaev +# Copyright 2011 OpenStack LLC. # All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); you may @@ -24,6 +24,7 @@ from nova.tests.api.openstack import fakes last_add_fixed_ip = (None, None) +last_remove_fixed_ip = (None, None) def compute_api_add_fixed_ip(self, context, instance_id, network_id): @@ -32,6 +33,12 @@ def compute_api_add_fixed_ip(self, context, instance_id, network_id): last_add_fixed_ip = (instance_id, network_id) +def compute_api_remove_fixed_ip(self, context, instance_id, address): + global last_remove_fixed_ip + + last_remove_fixed_ip = (instance_id, address) + + class FixedIpTest(test.TestCase): def setUp(self): super(FixedIpTest, self).setUp() @@ -43,6 +50,9 @@ class FixedIpTest(test.TestCase): fakes.stub_out_auth(self.stubs) self.stubs.Set(compute.api.API, "add_fixed_ip", compute_api_add_fixed_ip) + # TODO(Vek): Fails until remove_fixed_ip() added + # self.stubs.Set(compute.api.API, "remove_fixed_ip", + # compute_api_remove_fixed_ip) self.context = context.get_admin_context() def tearDown(self): @@ -61,7 +71,7 @@ class FixedIpTest(test.TestCase): resp = req.get_response(fakes.wsgi_app()) self.assertEqual(resp.status_int, 202) - self.assertNotEqual(last_add_fixed_ip, (None, None)) + self.assertEqual(last_add_fixed_ip, ('test_inst', 'test_net')) def test_add_fixed_ip_no_network(self): global last_add_fixed_ip @@ -78,6 +88,9 @@ class FixedIpTest(test.TestCase): self.assertEqual(last_add_fixed_ip, (None, None)) def test_remove_fixed_ip(self): + global last_remove_fixed_ip + last_remove_fixed_ip = (None, None) + body = dict(removeFixedIp=dict(address='10.10.10.1')) req = webob.Request.blank('/v1.1/servers/test_inst/action') req.method = 'POST' @@ -85,4 +98,20 @@ class FixedIpTest(test.TestCase): req.headers['content-type'] = 'application/json' resp = req.get_response(fakes.wsgi_app()) - self.assertEqual(resp.status_int, 501) + # TODO(Vek): Fails until remove_fixed_ip() added + self.assertEqual(resp.status_int, 202) + self.assertEqual(last_remove_fixed_ip, ('test_inst', '10.10.10.1')) + + def test_remove_fixed_ip_no_address(self): + global last_remove_fixed_ip + last_remove_fixed_ip = (None, None) + + body = dict(removeFixedIp=dict()) + req = webob.Request.blank('/v1.1/servers/test_inst/action') + req.method = 'POST' + req.body = json.dumps(body) + req.headers['content-type'] = 'application/json' + + resp = req.get_response(fakes.wsgi_app()) + self.assertEqual(resp.status_int, 422) + self.assertEqual(last_remove_fixed_ip, (None, None)) |
