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
	 Justin Hammond
					Justin Hammond