From 48f64b1086b5ce8b42367fbeeb5c46a8fdaba05a Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 11 Oct 2012 16:20:49 -0400 Subject: bcfg2-lint: rolled Duplicates plugin into MetadataLint --- src/lib/Bcfg2/Server/Lint/Duplicates.py | 73 -------------------------------- src/lib/Bcfg2/Server/Plugins/Metadata.py | 56 ++++++++++++++++++------ 2 files changed, 44 insertions(+), 85 deletions(-) delete mode 100644 src/lib/Bcfg2/Server/Lint/Duplicates.py (limited to 'src') diff --git a/src/lib/Bcfg2/Server/Lint/Duplicates.py b/src/lib/Bcfg2/Server/Lint/Duplicates.py deleted file mode 100644 index 9b36f054b..000000000 --- a/src/lib/Bcfg2/Server/Lint/Duplicates.py +++ /dev/null @@ -1,73 +0,0 @@ -""" Find duplicate clients, groups, etc. """ - -import Bcfg2.Server.Lint - - -class Duplicates(Bcfg2.Server.Lint.ServerPlugin): - """ Find duplicate clients, groups, etc. """ - - def __init__(self, *args, **kwargs): - Bcfg2.Server.Lint.ServerPlugin.__init__(self, *args, **kwargs) - self.groups_xdata = None - self.clients_xdata = None - self.load_xdata() - - def Run(self): - """ run plugin """ - # only run this plugin if we were not given a list of files. - # not only is it marginally silly to run this plugin with a - # partial list of files, it turns out to be really freaking - # hard to get only a fragment of group or client metadata - if self.groups_xdata is not None: - self.duplicate_groups() - self.duplicate_defaults() - if self.clients_xdata is not None: - self.duplicate_clients() - - @classmethod - def Errors(cls): - return {"duplicate-client": "error", - "duplicate-group": "error", - "duplicate-package": "error", - "multiple-default-groups": "error"} - - def load_xdata(self): - """ attempt to load XML data for groups and clients. only - actually load data if all documents reference in XIncludes can - be found in self.files""" - if self.has_all_xincludes("groups.xml"): - self.groups_xdata = self.metadata.clients_xml.xdata - if self.has_all_xincludes("clients.xml"): - self.clients_xdata = self.metadata.clients_xml.xdata - - def duplicate_groups(self): - """ find duplicate groups """ - self.duplicate_entries(self.clients_xdata.xpath('//Groups/Group'), - 'group') - - def duplicate_clients(self): - """ find duplicate clients """ - self.duplicate_entries(self.clients_xdata.xpath('//Clients/Client'), - 'client') - - def duplicate_entries(self, data, etype): - """ generic duplicate entry finder """ - seen = {} - for el in data: - if el.get('name') not in seen: - seen[el.get('name')] = el - else: - self.LintError("duplicate-%s" % etype, - "Duplicate %s '%s':\n%s\n%s" % - (etype, el.get('name'), - self.RenderXML(seen[el.get('name')]), - self.RenderXML(el))) - - def duplicate_defaults(self): - """ check for multiple default group definitions """ - default_groups = [g for g in self.groups_xdata.findall('.//Group') - if g.get('default') == 'true'] - if len(default_groups) > 1: - self.LintError("multiple-default-groups", - "Multiple default groups defined: %s" % - ",".join(default_groups)) diff --git a/src/lib/Bcfg2/Server/Plugins/Metadata.py b/src/lib/Bcfg2/Server/Plugins/Metadata.py index 0baf79547..761ebc2b7 100644 --- a/src/lib/Bcfg2/Server/Plugins/Metadata.py +++ b/src/lib/Bcfg2/Server/Plugins/Metadata.py @@ -1342,6 +1342,8 @@ class MetadataLint(Bcfg2.Server.Lint.ServerPlugin): self.deprecated_options() self.bogus_profiles() self.duplicate_groups() + self.duplicate_default_groups() + self.duplicate_clients() @classmethod def Errors(cls): @@ -1349,7 +1351,9 @@ class MetadataLint(Bcfg2.Server.Lint.ServerPlugin): "deprecated-clients-options": "warning", "nonexistent-profile-group": "error", "non-profile-set-as-profile": "error", - "duplicate-group": "error"} + "duplicate-group": "error", + "duplicate-client": "error", + "multiple-default-groups": "error"} def deprecated_options(self): """ check for the location='floating' option, which has been @@ -1397,17 +1401,45 @@ class MetadataLint(Bcfg2.Server.Lint.ServerPlugin): """ 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() + self.duplicate_entries( + self.metadata.groups_xml.xdata.xpath("//Groups/Group") + \ + self.metadata.groups_xml.xdata.xpath("//Groups/Group//Group"), + "group", + include=lambda g: (g.get("profile") or + g.get("public") or + g.getchildren())) + + def duplicate_default_groups(self): + """ check for multiple default groups """ + defaults = [] 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)) + if grp.get("default"): + defaults.append(self.RenderXML(grp)) + if len(defaults) > 1: + self.LintError("multiple-default-groups", + "Multiple default groups defined:\n%s" % + "\n".join(defaults)) + + def duplicate_clients(self): + """ check for clients that are defined twice. """ + self.duplicate_entries( + self.metadata.clients_xml.xdata.xpath("//Client"), + "client") + + def duplicate_entries(self, allentries, etype, include=None): + """ generic duplicate entry finder """ + if include is None: + include = lambda e: True + entries = dict() + for el in allentries: + if include(el): + if el.get("name") in entries: + entries[el.get("name")].append(self.RenderXML(el)) 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))) + entries[el.get("name")] = [self.RenderXML(el)] + for ename, els in entries.items(): + if len(els) > 1: + self.LintError("duplicate-%s" % etype, + "%s %s is defined multiple times:\n%s" % + (etype.title(), ename, "\n".join(els))) -- cgit v1.2.3-1-g7c22