From 625fdb423e289ee98dbfbd4c81edf64b598cb352 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 --- .../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 dcc3794b807..a70735d2d8b 100644 --- a/neutron/plugins/ml2/extensions/dns_integration.py +++ b/neutron/plugins/ml2/extensions/dns_integration.py @@ -76,7 +76,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 dns_name, is_dns_domain_default = self._get_request_dns_name( request_data) 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 264218a301a..e0ac55aa40a 100644 --- a/neutron/tests/unit/plugins/ml2/extensions/test_dns_integration.py +++ b/neutron/tests/unit/plugins/ml2/extensions/test_dns_integration.py @@ -478,6 +478,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_for_test(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.plugin.create_port(self.context, port_request) + def test_dns_driver_loaded_after_server_restart(self, *mocks): dns_integration.DNS_DRIVER = None net, port, dns_data_db = self._create_port_for_test()