diff options
-rw-r--r-- | nova/api/openstack/compute/contrib/floating_ips.py | 7 | ||||
-rw-r--r-- | nova/tests/api/openstack/compute/contrib/test_floating_ips.py | 29 |
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): |