From 494b283eed095346a62ee7024d6099d134aa8144 Mon Sep 17 00:00:00 2001 From: Shih-Hao Li Date: Wed, 24 Aug 2016 14:56:49 -0700 Subject: [PATCH] Unable to add classless-static-route in extra_dhcp_opt extension When adding classless-static-route in extra_dhcp_opt for a port, neutron client complains syntax error. The reason is neutron client interprets the "," inside the opt_value as a delimiter of key-value pairs for --extra-dhcp-opt. This patch modifies neutron client to allow commas inside opt_value. This is one of two proposed solutions described in #1605421. Change-Id: I8ade427885d11f86d594cecaed96fcb82e38798f Closes-Bug: #1605421 --- neutronclient/common/utils.py | 11 +++++++++++ neutronclient/tests/unit/test_utils.py | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/neutronclient/common/utils.py b/neutronclient/common/utils.py index 882eb2c5c..d4b53d075 100644 --- a/neutronclient/common/utils.py +++ b/neutronclient/common/utils.py @@ -130,7 +130,18 @@ def str2dict(strdict, required_keys=None, optional_keys=None): """ result = {} if strdict: + i = 0 + kvlist = [] for kv in strdict.split(','): + if '=' in kv: + kvlist.append(kv) + i += 1 + elif i == 0: + msg = _("missing value for key '%s'") + raise argparse.ArgumentTypeError(msg % kv) + else: + kvlist[i-1] = "%s,%s" % (kvlist[i-1], kv) + for kv in kvlist: key, sep, value = kv.partition('=') if not sep: msg = _("invalid key-value '%s', expected format: key=value") diff --git a/neutronclient/tests/unit/test_utils.py b/neutronclient/tests/unit/test_utils.py index 44152418d..249670604 100644 --- a/neutronclient/tests/unit/test_utils.py +++ b/neutronclient/tests/unit/test_utils.py @@ -49,6 +49,13 @@ class TestUtils(testtools.TestCase): self.assertRaises(argparse.ArgumentTypeError, utils.str2dict, input_str) + def test_string_with_comma_value_to_dictionary(self): + input_str = ('opt_name=classless-static-route,' + 'opt_value=169.254.169.254/32,10.0.0.1') + expected = {'opt_name': 'classless-static-route', + 'opt_value': '169.254.169.254/32,10.0.0.1'} + self.assertEqual(expected, utils.str2dict(input_str)) + def test_str2dict_optional_keys(self): self.assertDictEqual({'key1': 'value1'}, utils.str2dict('key1=value1',