From 072dce2ad09a6b28813f9b8f13d3e8a7bcc0d987 Mon Sep 17 00:00:00 2001 From: Gary Kotton Date: Sun, 1 Jul 2012 06:46:29 -0400 Subject: [PATCH] Ensure that subnet_id is on correct network. Fixes bug 1019759. Change-Id: I7a732ebf404c6fddaf6f06798411adbadd8ebb3f --- quantum/db/db_base_plugin_v2.py | 5 +++++ quantum/tests/unit/test_db_plugin.py | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/quantum/db/db_base_plugin_v2.py b/quantum/db/db_base_plugin_v2.py index 55f98fd18..ab4da9090 100644 --- a/quantum/db/db_base_plugin_v2.py +++ b/quantum/db/db_base_plugin_v2.py @@ -344,6 +344,11 @@ class QuantumDbPluginV2(quantum_plugin_base_v2.QuantumPluginBaseV2): raise q_exc.InvalidInput(error_message=msg) else: subnet = self._get_subnet(context, fixed['subnet_id']) + if subnet['network_id'] != network_id: + msg = _('Failed to create port on network %s, ' + 'because fixed_ips included invalid subnet ' + '%s') % (network_id, fixed['subnet_id']) + raise q_exc.InvalidInput(error_message=msg) subnet_id = subnet['id'] if 'ip_address' in fixed: diff --git a/quantum/tests/unit/test_db_plugin.py b/quantum/tests/unit/test_db_plugin.py index cdfa42ecd..c0808b540 100644 --- a/quantum/tests/unit/test_db_plugin.py +++ b/quantum/tests/unit/test_db_plugin.py @@ -425,6 +425,24 @@ class TestPortsV2(QuantumDbPluginV2TestCase): self.assertEquals(ips[0]['ip_address'], '10.0.0.3') self.assertEquals(ips[0]['subnet_id'], subnet['subnet']['id']) + def test_requested_subnet_id_not_on_network(self): + fmt = 'json' + with self.subnet() as subnet: + with self.port(subnet=subnet) as port: + # Create new network + res = self._create_network(fmt=fmt, name='net2', + admin_status_up=True) + network2 = self.deserialize(fmt, res) + subnet2 = self._make_subnet(fmt, network2, "1.1.1.1", + "1.1.1.0/24", 4) + net_id = port['port']['network_id'] + # Request a IP from specific subnet + kwargs = {"fixed_ips": [{'subnet_id': + subnet2['subnet']['id']}]} + net_id = port['port']['network_id'] + res = self._create_port(fmt, net_id=net_id, **kwargs) + self.assertEquals(res.status_int, 400) + def test_requested_subnet_id_v4_and_v6(self): fmt = 'json' with self.subnet() as subnet: -- 2.45.2