diff --git a/quark/plugin_modules/ip_addresses.py b/quark/plugin_modules/ip_addresses.py index 2517817..514deaa 100644 --- a/quark/plugin_modules/ip_addresses.py +++ b/quark/plugin_modules/ip_addresses.py @@ -150,6 +150,9 @@ def create_ip_address(context, body): LOG.info("create_ip_address for tenant %s" % context.tenant_id) iptype = (ip_types.SHARED if _shared_ip_request(body) else ip_types.FIXED) + if 'ip_address' not in body: + raise exceptions.BadRequest(resource="ip_addresses", + msg="Invalid request body.") if iptype == ip_types.FIXED and not CONF.QUARK.ipaddr_allow_fixed_ip: raise exceptions.BadRequest(resource="ip_addresses", msg="Only shared IPs may be made with " @@ -255,6 +258,9 @@ def update_ip_address(context, id, ip_address): """Due to NCP-1592 ensure that address_type cannot change after update.""" LOG.info("update_ip_address %s for tenant %s" % (id, context.tenant_id)) ports = [] + if 'ip_address' not in ip_address: + raise exceptions.BadRequest(resource="ip_addresses", + msg="Invalid request body.") with context.session.begin(): address = db_api.ip_address_find(context, id=id, scope=db_api.ONE) if not address: diff --git a/quark/tests/functional/plugin_modules/test_shared_ips.py b/quark/tests/functional/plugin_modules/test_shared_ips.py index d535094..1bed4f8 100644 --- a/quark/tests/functional/plugin_modules/test_shared_ips.py +++ b/quark/tests/functional/plugin_modules/test_shared_ips.py @@ -101,6 +101,40 @@ class QuarkSharedIPs(BaseFunctionalTest): with self.assertRaises(self.disassociate_exception): ip_api.delete_ip_address(self.context, ip['id']) + def test_update_shared_ip_with_plural_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 = [ports[0]['id'], ports[3]['id']] + 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): + + 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 = [ports[0]['id'], ports[3]['id']] + shared_ip = {'delasdfkj': 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_unowned_ports_is_okay(self): with self._stubs(self.network, self.subnet, self.ports_info4) as ( @@ -298,6 +332,30 @@ class QuarkSharedIPs(BaseFunctionalTest): ports_ip = ip_api.get_ports_for_ip_address(self.context, ip['id']) self.assertEqual(2, len(ports_ip)) + def test_create_shared_ips_fails_with_plural_body(self): + + with self._stubs(self.network, self.subnet, self.ports_info2) as ( + net, sub, ports): + + port_ids = [ports[0]['id'], ports[1]['id']] + shared_ip = {'ip_addresses': dict(port_ids=port_ids, + network_id=net['id'], + version=4)} + with self.assertRaises(exceptions.BadRequest): + ip_api.create_ip_address(self.context, shared_ip) + + def test_create_shared_ips_fails_with_garbage_body(self): + + with self._stubs(self.network, self.subnet, self.ports_info2) as ( + net, sub, ports): + + port_ids = [ports[0]['id'], ports[1]['id']] + shared_ip = {'derpie_derp': dict(port_ids=port_ids, + network_id=net['id'], + version=4)} + with self.assertRaises(exceptions.BadRequest): + ip_api.create_ip_address(self.context, shared_ip) + def test_shared_ip_in_fixed_ip_list(self): with self._stubs(self.network, self.subnet, self.ports_info2) as (