From b0778fe801331284b5b43d1e7c79ac6a9b0c1cce Mon Sep 17 00:00:00 2001 From: Graham Hayes Date: Fri, 22 Jul 2016 20:55:44 +0100 Subject: [PATCH] Avoid KeyError when accessing "dns_name" as it may not exist Neutron LBaaS does not pass a full copy of the request_data into this function, and causes the port create to fail with a KeyError Change-Id: Ib81cbbaf24a4ffaa983e1b05146aea0dc74e29bb Fixes-Bug: #1605336 (cherry picked from commit 625fdb423e289ee98dbfbd4c81edf64b598cb352) --- .../plugins/ml2/extensions/dns_integration.py | 2 +- .../ml2/extensions/test_dns_integration.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/neutron/plugins/ml2/extensions/dns_integration.py b/neutron/plugins/ml2/extensions/dns_integration.py index 02633c3ceea..7aaf64b2162 100644 --- a/neutron/plugins/ml2/extensions/dns_integration.py +++ b/neutron/plugins/ml2/extensions/dns_integration.py @@ -75,7 +75,7 @@ class DNSExtensionDriver(api.ExtensionDriver): db_data[dns.DNSDOMAIN] = new_value def process_create_port(self, plugin_context, request_data, db_data): - if not request_data[dns.DNSNAME]: + if not request_data.get(dns.DNSNAME): return network = self._get_network(plugin_context, db_data['network_id']) if not network[dns.DNSDOMAIN]: diff --git a/neutron/tests/unit/plugins/ml2/extensions/test_dns_integration.py b/neutron/tests/unit/plugins/ml2/extensions/test_dns_integration.py index 5f0885155de..2a35c0128bb 100644 --- a/neutron/tests/unit/plugins/ml2/extensions/test_dns_integration.py +++ b/neutron/tests/unit/plugins/ml2/extensions/test_dns_integration.py @@ -460,6 +460,24 @@ class DNSIntegrationTestCase(test_plugin.Ml2PluginV2TestCase): self.assertFalse( mock_admin_client.recordsets.delete.call_args_list) + def test_create_port_dns_name_field_missing(self, *mocks): + res = self._create_network(self.fmt, 'test_network', True) + net = self.deserialize(self.fmt, res)['network'] + cidr = '10.0.0.0/24' + self._create_subnet(self.fmt, net['id'], cidr) + port_request = { + 'port': { + 'network_id': net['id'], + 'tenant_id': net['tenant_id'], + 'name': 'mugsie', + 'admin_state_up': True, + 'device_id': '', + 'device_owner': '', + 'fixed_ips': '' + } + } + self._create_port('json', net['id'], **port_request) + def test_dns_driver_loaded_after_server_restart(self, *mocks): dns_integration.DNS_DRIVER = None config.cfg.CONF.set_override('dns_domain', DNSDOMAIN)