summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2012-10-09 15:19:08 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2012-10-09 15:19:48 -0400
commite77969e61ff254a9b0abeeafc0e9643580ed4d76 (patch)
tree2e6feba3059fbb88d4f85e2d1b941e0f82f5c308
parent5301a90168f910b47401996a7ad6afbea0b08ac0 (diff)
downloadbcfg2-e77969e61ff254a9b0abeeafc0e9643580ed4d76.tar.gz
bcfg2-e77969e61ff254a9b0abeeafc0e9643580ed4d76.tar.bz2
bcfg2-e77969e61ff254a9b0abeeafc0e9643580ed4d76.zip
bcfg2-lint: check for duplicate groups defined in Metadata
-rw-r--r--src/lib/Bcfg2/Server/Plugins/Metadata.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/lib/Bcfg2/Server/Plugins/Metadata.py b/src/lib/Bcfg2/Server/Plugins/Metadata.py
index 11498c1e1..0baf79547 100644
--- a/src/lib/Bcfg2/Server/Plugins/Metadata.py
+++ b/src/lib/Bcfg2/Server/Plugins/Metadata.py
@@ -1341,13 +1341,15 @@ class MetadataLint(Bcfg2.Server.Lint.ServerPlugin):
self.nested_clients()
self.deprecated_options()
self.bogus_profiles()
+ self.duplicate_groups()
@classmethod
def Errors(cls):
return {"nested-client-tags": "warning",
"deprecated-clients-options": "warning",
"nonexistent-profile-group": "error",
- "non-profile-set-as-profile": "error"}
+ "non-profile-set-as-profile": "error",
+ "duplicate-group": "error"}
def deprecated_options(self):
""" check for the location='floating' option, which has been
@@ -1390,3 +1392,22 @@ class MetadataLint(Bcfg2.Server.Lint.ServerPlugin):
"profile group:\n%s" %
(profile, client.get("name"), profile,
self.RenderXML(client)))
+
+ def duplicate_groups(self):
+ """ check for groups that are defined twice. We count a group
+ tag as a definition if it a) has profile or public set; or b)
+ has any children. """
+ groups = dict()
+ for grp in self.metadata.groups_xml.xdata.xpath("//Groups/Group") + \
+ self.metadata.groups_xml.xdata.xpath("//Groups/Group//Group"):
+ if grp.get("profile") or grp.get("public") or grp.getchildren():
+ if grp.get("name") in groups:
+ groups[grp.get("name")].append(self.RenderXML(grp))
+ else:
+ groups[grp.get("name")] = [self.RenderXML(grp)]
+ for gname, grps in groups.items():
+ if len(grps) > 1:
+ self.LintError("duplicate-group",
+ "Group %s is defined multiple times in %s:\n%s"
+ % (gname, self.metadata.groups_xml.name,
+ "\n".join(grps)))