summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin L. Mitchell <kevin.mitchell@rackspace.com>2011-07-08 13:06:37 -0500
committerKevin L. Mitchell <kevin.mitchell@rackspace.com>2011-07-08 13:06:37 -0500
commit921fee22ff42852b1ee0d7f3d051b44d60afd975 (patch)
tree753a5a39b54d34fd298b7bf489b2525a6201012f
parente7bc748edef30b106628946eeda36818aac4fe9d (diff)
Add support for remove_fixed_ip()
-rw-r--r--nova/api/openstack/contrib/multinic.py20
-rw-r--r--nova/tests/api/openstack/contrib/test_multinic_xs.py35
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))