From 1c6be336049ae337e3de1b37b86eea9f31b0e16e Mon Sep 17 00:00:00 2001 From: Haowei Cai Date: Wed, 21 Feb 2018 17:59:21 -0800 Subject: [PATCH] get_with_name raises exception on name duplication in kubeconfig --- config/kube_config.py | 11 ++++++++++- config/kube_config_test.py | 13 +++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/config/kube_config.py b/config/kube_config.py index 4e09d6a95..077a4142d 100644 --- a/config/kube_config.py +++ b/config/kube_config.py @@ -298,6 +298,7 @@ class ConfigNode(object): raise ConfigException( 'Invalid kube-config file. Expected %s to be a list' % self.name) + result = None for v in self.value: if 'name' not in v: raise ConfigException( @@ -305,7 +306,15 @@ class ConfigNode(object): 'Expected all values in %s list to have \'name\' key' % self.name) if v['name'] == name: - return ConfigNode('%s[name=%s]' % (self.name, name), v) + if result is None: + result = v + else: + raise ConfigException( + 'Invalid kube-config file. ' + 'Expected only one object with name %s in %s list' + % (name, self.name)) + if result is not None: + return ConfigNode('%s[name=%s]' % (self.name, name), result) if safe: return None raise ConfigException( diff --git a/config/kube_config_test.py b/config/kube_config_test.py index d6586713c..11c8dccf1 100644 --- a/config/kube_config_test.py +++ b/config/kube_config_test.py @@ -180,7 +180,11 @@ class TestConfigNode(BaseTestCase): "with_names": [{"name": "test_name", "value": "test_value"}, {"name": "test_name2", "value": {"key1", "test"}}, - {"name": "test_name3", "value": [1, 2, 3]}]} + {"name": "test_name3", "value": [1, 2, 3]}], + "with_names_dup": [{"name": "test_name", "value": "test_value"}, + {"name": "test_name", + "value": {"key1", "test"}}, + {"name": "test_name3", "value": [1, 2, 3]}]} def setUp(self): super(TestConfigNode, self).setUp() @@ -188,7 +192,7 @@ class TestConfigNode(BaseTestCase): def test_normal_map_array_operations(self): self.assertEqual("test", self.node['key1']) - self.assertEqual(4, len(self.node)) + self.assertEqual(5, len(self.node)) self.assertEqual("test_obj/key2", self.node['key2'].name) self.assertEqual(["a", "b", "c"], self.node['key2'].value) @@ -235,6 +239,11 @@ class TestConfigNode(BaseTestCase): lambda: self.node['with_names'].get_with_name('no-name'), "Expected object with name no-name in test_obj/with_names list") + def test_get_with_name_on_duplicate_name(self): + self.expect_exception( + lambda: self.node['with_names_dup'].get_with_name('test_name'), + "Expected only one object with name test_name in test_obj/with_names_dup list") + class FakeConfig: