Prevents PUT on ip_addresses with empty port list
JIRA:NCP-1631
This commit is contained in:
@@ -281,7 +281,13 @@ def update_ip_address(context, id, ip_address):
|
|||||||
msg = "Modification of reset_allocation_time requires admin"
|
msg = "Modification of reset_allocation_time requires admin"
|
||||||
raise webob.exc.HTTPForbidden(detail=msg)
|
raise webob.exc.HTTPForbidden(detail=msg)
|
||||||
|
|
||||||
port_ids = ip_address['ip_address'].get('port_ids')
|
port_ids = ip_address['ip_address'].get('port_ids', None)
|
||||||
|
|
||||||
|
if port_ids is not None and not port_ids:
|
||||||
|
raise exceptions.BadRequest(
|
||||||
|
resource="ip_addresses",
|
||||||
|
msg="Cannot be updated with empty port_id list")
|
||||||
|
|
||||||
if iptype == ip_types.SHARED:
|
if iptype == ip_types.SHARED:
|
||||||
has_owner = address.has_any_shared_owner()
|
has_owner = address.has_any_shared_owner()
|
||||||
|
|
||||||
|
|||||||
@@ -118,6 +118,23 @@ class QuarkSharedIPs(BaseFunctionalTest):
|
|||||||
with self.assertRaises(exceptions.BadRequest):
|
with self.assertRaises(exceptions.BadRequest):
|
||||||
ip_api.update_ip_address(self.context, ip['id'], shared_ip)
|
ip_api.update_ip_address(self.context, ip['id'], shared_ip)
|
||||||
|
|
||||||
|
def test_update_shared_ip_with_empty_port_id_list_will_error(self):
|
||||||
|
|
||||||
|
with self._stubs(self.network, self.subnet, self.ports_info4) as (
|
||||||
|
net, sub, ports):
|
||||||
|
|
||||||
|
port_ids = [ports[0]['id'], ports[1]['id']]
|
||||||
|
shared_ip = {'ip_address': dict(port_ids=port_ids,
|
||||||
|
network_id=net['id'],
|
||||||
|
version=4)}
|
||||||
|
ip = ip_api.create_ip_address(self.context, shared_ip)
|
||||||
|
self.assertEqual(ip_types.SHARED, ip['type'])
|
||||||
|
port_ids = []
|
||||||
|
shared_ip = {'ip_addresses': dict(port_ids=port_ids)}
|
||||||
|
|
||||||
|
with self.assertRaises(exceptions.BadRequest):
|
||||||
|
ip_api.update_ip_address(self.context, ip['id'], shared_ip)
|
||||||
|
|
||||||
def test_update_shared_ip_with_garbage_will_error(self):
|
def test_update_shared_ip_with_garbage_will_error(self):
|
||||||
|
|
||||||
with self._stubs(self.network, self.subnet, self.ports_info4) as (
|
with self._stubs(self.network, self.subnet, self.ports_info4) as (
|
||||||
@@ -269,30 +286,6 @@ class QuarkSharedIPs(BaseFunctionalTest):
|
|||||||
|
|
||||||
ip_api.update_ip_address(self.context, ip['id'], shared_ip)
|
ip_api.update_ip_address(self.context, ip['id'], shared_ip)
|
||||||
|
|
||||||
def test_update_shared_ip_with_owned_port_error_deallocate(self):
|
|
||||||
|
|
||||||
with self._stubs(self.network, self.subnet, self.ports_info4) as (
|
|
||||||
net, sub, ports):
|
|
||||||
|
|
||||||
port_ids = [ports[0]['id'], ports[1]['id']]
|
|
||||||
p_id = ports[0]['id']
|
|
||||||
|
|
||||||
shared_ip = {'ip_address': dict(port_ids=port_ids,
|
|
||||||
network_id=net['id'],
|
|
||||||
version=4)}
|
|
||||||
ip = ip_api.create_ip_address(self.context, shared_ip)
|
|
||||||
self.assertEqual(ip_types.SHARED, ip['type'])
|
|
||||||
|
|
||||||
port_ip_update = ip_api.update_port_for_ip_address
|
|
||||||
port_ip_update(self.context, ip['id'], p_id,
|
|
||||||
self._make_port_body('derp'))
|
|
||||||
|
|
||||||
port_ids = []
|
|
||||||
shared_ip = {'ip_address': dict(port_ids=port_ids)}
|
|
||||||
|
|
||||||
with self.assertRaises(self.disassociate_exception):
|
|
||||||
ip_api.update_ip_address(self.context, ip['id'], shared_ip)
|
|
||||||
|
|
||||||
def test_update_shared_ip_with_owned_port_error(self):
|
def test_update_shared_ip_with_owned_port_error(self):
|
||||||
|
|
||||||
with self._stubs(self.network, self.subnet, self.ports_info4) as (
|
with self._stubs(self.network, self.subnet, self.ports_info4) as (
|
||||||
|
|||||||
@@ -553,16 +553,15 @@ class TestQuarkUpdateIPAddress(test_quark_plugin.TestQuarkPlugin):
|
|||||||
ip_address)
|
ip_address)
|
||||||
self.assertEqual(response['port_ids'], [])
|
self.assertEqual(response['port_ids'], [])
|
||||||
|
|
||||||
def test_update_ip_address_empty_ports_delete(self):
|
def test_update_ip_address_empty_ports_does_not_delete_but_errors(self):
|
||||||
port = dict(id=1, network_id=2, ip_addresses=[])
|
port = dict(id=1, network_id=2, ip_addresses=[])
|
||||||
ip = dict(id=1, address=3232235876, address_readable="192.168.1.100",
|
ip = dict(id=1, address=3232235876, address_readable="192.168.1.100",
|
||||||
subnet_id=1, network_id=2, version=4)
|
subnet_id=1, network_id=2, version=4)
|
||||||
with self._stubs(ports=[port], addr=ip, addr_ports=True):
|
with self._stubs(ports=[port], addr=ip, addr_ports=True):
|
||||||
ip_address = {'ip_address': {'port_ids': []}}
|
ip_address = {'ip_address': {'port_ids': []}}
|
||||||
response = self.plugin.update_ip_address(self.context,
|
with self.assertRaises(exceptions.BadRequest):
|
||||||
ip['id'],
|
self.plugin.update_ip_address(self.context, ip['id'],
|
||||||
ip_address)
|
ip_address)
|
||||||
self.assertEqual(response['port_ids'], [])
|
|
||||||
|
|
||||||
|
|
||||||
class TestQuarkGetIpAddress(test_quark_plugin.TestQuarkPlugin):
|
class TestQuarkGetIpAddress(test_quark_plugin.TestQuarkPlugin):
|
||||||
|
|||||||
Reference in New Issue
Block a user