diff --git a/config/kube_config.py b/config/kube_config.py index 4e09d6a9..077a4142 100644 --- a/config/kube_config.py +++ b/config/kube_config.py @@ -298,6 +298,7 @@ def get_with_name(self, name, safe=False): 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 @@ def get_with_name(self, name, safe=False): '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 d6586713..11c8dccf 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 @@ def setUp(self): 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 @@ def test_get_with_name_on_name_does_not_exists(self): 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: