diff --git a/confluent_server/confluent/config/configmanager.py b/confluent_server/confluent/config/configmanager.py index 4ccedf99..c165278a 100644 --- a/confluent_server/confluent/config/configmanager.py +++ b/confluent_server/confluent/config/configmanager.py @@ -2023,7 +2023,11 @@ class ConfigManager(object): continue # next node, this node already in self._node_added_to_group(node, group, changeset) - async def add_group_attributes(self, attribmap): + async def add_group_attributes(self, attribmap, checkconflict=False): + if checkconflict: + for groupname in attribmap: + if groupname in self._cfgstore.get('nodes', {}): + raise ValueError('Group "{}" conflicts with an existing node'.format(groupname)) await self.set_group_attributes(attribmap, autocreate=True) async def set_group_attributes(self, attribmap, autocreate=False, merge="replace", keydata=None, skipped=None): @@ -2422,7 +2426,11 @@ class ConfigManager(object): self._notif_attribwatchers(changeset) self._bg_sync_to_file() - async def add_node_attributes(self, attribmap): + async def add_node_attributes(self, attribmap, checkconflict=False): + if checkconflict: + for nodename in attribmap: + if nodename in self._cfgstore.get('nodegroups', {}): + raise ValueError('Node "{}" conflicts with an existing group'.format(nodename)) await self.set_node_attributes(attribmap, autocreate=True) async def rename_nodes(self, renamemap): diff --git a/confluent_server/confluent/core.py b/confluent_server/confluent/core.py index 82da37f7..29073c88 100644 --- a/confluent_server/confluent/core.py +++ b/confluent_server/confluent/core.py @@ -818,7 +818,7 @@ async def create_group(inputdata, configmanager): except KeyError: raise exc.InvalidArgumentException() try: - await configmanager.add_group_attributes(attribmap) + await configmanager.add_group_attributes(attribmap, checkconflict=True) except ValueError as e: raise exc.InvalidArgumentException(str(e)) yield msg.CreatedResource(groupname) @@ -834,7 +834,7 @@ async def create_node(inputdata, configmanager): except KeyError: raise exc.InvalidArgumentException('name not specified') try: - await configmanager.add_node_attributes(attribmap) + await configmanager.add_node_attributes(attribmap, checkconflict=True) except ValueError as e: raise exc.InvalidArgumentException(str(e)) yield msg.CreatedResource(nodename) @@ -850,7 +850,7 @@ async def create_noderange(inputdata, configmanager): except KeyError: raise exc.InvalidArgumentException('name not specified') try: - await configmanager.add_node_attributes(attribmap) + await configmanager.add_node_attributes(attribmap, checkconflict=True) except ValueError as e: raise exc.InvalidArgumentException(str(e)) for node in attribmap: