summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/compute/contrib/floating_ips.py7
-rw-r--r--nova/tests/api/openstack/compute/contrib/test_floating_ips.py29
2 files changed, 35 insertions, 1 deletions
diff --git a/nova/api/openstack/compute/contrib/floating_ips.py b/nova/api/openstack/compute/contrib/floating_ips.py
index 6fb9f0cc1..6e3c24567 100644
--- a/nova/api/openstack/compute/contrib/floating_ips.py
+++ b/nova/api/openstack/compute/contrib/floating_ips.py
@@ -27,6 +27,7 @@ from nova.compute import utils as compute_utils
from nova import exception
from nova import network
from nova.openstack.common import log as logging
+from nova import utils
LOG = logging.getLogger(__name__)
@@ -282,7 +283,11 @@ class FloatingIPActionController(wsgi.Controller):
instance = get_instance_by_floating_ip_addr(self, context, address)
# disassociate if associated
- if instance and floating_ip.get('fixed_ip_id'):
+ if (instance and
+ floating_ip.get('fixed_ip_id') and
+ (utils.is_uuid_like(id) and
+ [instance['uuid'] == id] or
+ [instance['id'] == id])[0]):
disassociate_floating_ip(self, context, instance, address)
return webob.Response(status_int=202)
else:
diff --git a/nova/tests/api/openstack/compute/contrib/test_floating_ips.py b/nova/tests/api/openstack/compute/contrib/test_floating_ips.py
index e1602f832..f7788101c 100644
--- a/nova/tests/api/openstack/compute/contrib/test_floating_ips.py
+++ b/nova/tests/api/openstack/compute/contrib/test_floating_ips.py
@@ -328,6 +328,35 @@ class FloatingIpTest(test.TestCase):
rsp = self.manager._remove_floating_ip(req, 'test_inst', body)
self.assertTrue(rsp.status_int == 404)
+ def test_floating_ip_disassociate_wrong_instance_uuid(self):
+ def get_instance_by_floating_ip_addr(self, context, address):
+ if address == '10.10.10.10':
+ return 'test_inst'
+
+ self.stubs.Set(network.api.API, "get_instance_id_by_floating_address",
+ get_instance_by_floating_ip_addr)
+
+ wrong_uuid = 'aaaaaaaa-ffff-ffff-ffff-aaaaaaaaaaaa'
+ body = dict(removeFloatingIp=dict(address='10.10.10.10'))
+
+ req = fakes.HTTPRequest.blank('/v2/fake/servers/test_inst/action')
+ rsp = self.manager._remove_floating_ip(req, wrong_uuid, body)
+ self.assertTrue(rsp.status_int == 404)
+
+ def test_floating_ip_disassociate_wrong_instance_id(self):
+ def get_instance_by_floating_ip_addr(self, context, address):
+ if address == '10.10.10.10':
+ return 'wrong_inst'
+
+ self.stubs.Set(network.api.API, "get_instance_id_by_floating_address",
+ get_instance_by_floating_ip_addr)
+
+ body = dict(removeFloatingIp=dict(address='10.10.10.10'))
+
+ req = fakes.HTTPRequest.blank('/v2/fake/servers/test_inst/action')
+ rsp = self.manager._remove_floating_ip(req, 'test_inst', body)
+ self.assertTrue(rsp.status_int == 404)
+
# these are a few bad param tests
def test_bad_address_param_in_remove_floating_ip(self):