From 7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 3 Nov 2011 09:15:12 -0400 Subject: added support for default/mandatory/optional package groups --- src/lib/Server/Plugins/Packages/Collection.py | 4 ++-- src/lib/Server/Plugins/Packages/Source.py | 2 +- src/lib/Server/Plugins/Packages/Yum.py | 8 +++---- src/lib/Server/Plugins/Packages/__init__.py | 8 ++++++- src/sbin/bcfg2-yum-helper | 33 +++++++++++++++++++++------ 5 files changed, 40 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/lib/Server/Plugins/Packages/Collection.py b/src/lib/Server/Plugins/Packages/Collection.py index c303134fe..2d9cd8a09 100644 --- a/src/lib/Server/Plugins/Packages/Collection.py +++ b/src/lib/Server/Plugins/Packages/Collection.py @@ -69,9 +69,9 @@ class Collection(object): cachefiles.add(source.cachefile) return list(cachefiles) - def get_group(self, group): + def get_group(self, group, ptype=None): for source in self.sources: - pkgs = source.get_group(self.metadata, group) + pkgs = source.get_group(self.metadata, group, ptype=ptype) if pkgs: return pkgs self.logger.warning("Packages: '%s' is not a valid group" % group) diff --git a/src/lib/Server/Plugins/Packages/Source.py b/src/lib/Server/Plugins/Packages/Source.py index 1f0cd8e96..72c7a4bfd 100644 --- a/src/lib/Server/Plugins/Packages/Source.py +++ b/src/lib/Server/Plugins/Packages/Source.py @@ -241,7 +241,7 @@ class Source(object): def get_package(self, metadata, package): return package - def get_group(self, metadata, package): + def get_group(self, metadata, group, ptype=None): return [] def magic_groups_match(self, metadata): diff --git a/src/lib/Server/Plugins/Packages/Yum.py b/src/lib/Server/Plugins/Packages/Yum.py index a7a066634..369b7a7d2 100644 --- a/src/lib/Server/Plugins/Packages/Yum.py +++ b/src/lib/Server/Plugins/Packages/Yum.py @@ -317,16 +317,16 @@ class YumCollection(Collection): # for API completeness return self.call_helper("get_provides", package) - def get_group(self, group): + def get_group(self, group, ptype="default"): if not self.use_yum: - self.logger.warning("Packages: Package groups are not supported by Bcfg2's " - "internal Yum dependency generator") + self.logger.warning("Packages: Package groups are not supported by " + "Bcfg2's internal Yum dependency generator") return [] if group.startswith("@"): group = group[1:] - pkgs = self.call_helper("get_group", group) + pkgs = self.call_helper("get_group", dict(group=group, type=ptype)) return pkgs def complete(self, packagelist): diff --git a/src/lib/Server/Plugins/Packages/__init__.py b/src/lib/Server/Plugins/Packages/__init__.py index a8cade17d..5b1515920 100644 --- a/src/lib/Server/Plugins/Packages/__init__.py +++ b/src/lib/Server/Plugins/Packages/__init__.py @@ -138,8 +138,14 @@ class Packages(Bcfg2.Server.Plugin.Plugin, initial.add(pkg.get("name")) elif pkg.get("group"): try: - base.update(collection.get_group(pkg.get("group"))) + if pkg.get("type"): + gpkgs = collection.get_group(pkg.get("group"), + ptype=pkg.get("type")) + else: + gpkgs = collection.get_group(pkg.get("group")) + base.update(gpkgs) except TypeError: + raise self.logger.error("Could not resolve group %s" % pkg.get("group")) to_remove.append(pkg) diff --git a/src/sbin/bcfg2-yum-helper b/src/sbin/bcfg2-yum-helper index 1fb7c8891..e0ba02382 100755 --- a/src/sbin/bcfg2-yum-helper +++ b/src/sbin/bcfg2-yum-helper @@ -105,22 +105,34 @@ class DepSolver(object): self.get_package_name(required)) return prov - def get_group(self, group): + def get_group(self, group, ptype="default"): if group.startswith("@"): group = group[1:] try: if self.yumbase.comps.has_group(group): - pkgs = self.yumbase.comps.return_group(group).packages + group = self.yumbase.comps.return_group(group) else: logger.warning("Packages: '%s' is not a valid group" % group) - pkgs = [] + return [] except yum.Errors.GroupsError: err = sys.exc_info()[1] logger.warning("Packages: %s" % err) - pkgs = [] - - return pkgs + return [] + + if ptype == "default": + return [p + for p, d in list(group.default_packages.items()) + if d] + elif ptype == "mandatory": + return [p + for p, m in list(group.mandatory_packages.items()) + if m] + elif ptype == "optional" or ptype == "all": + return group.packages + else: + logger.warning("Unknown group package type '%s'" % ptype) + return [] def _filter_provides(self, package, providers): providers = [pkg for pkg in self._filter_arch(providers)] @@ -300,9 +312,16 @@ def main(): elif cmd == "is_virtual_package": package = json.loads(sys.stdin.read()) print json.dumps(bool(depsolver.get_provides(package, silent=True))) - elif (cmd == "get_deps" or cmd == "get_provides" or cmd == "get_group"): + elif cmd == "get_deps" or cmd == "get_provides": package = json.loads(sys.stdin.read()) print json.dumps(list(getattr(depsolver, cmd)(package))) + elif cmd == "get_group": + data = json.loads(sys.stdin.read()) + if "type" in data: + packages = depsolver.get_group(data['group'], ptype=data['type']) + else: + packages = depsolver.get_group(data['group']) + print json.dumps(list(packages)) elif cmd == "is_package": package = json.loads(sys.stdin.read()) print json.dumps(getattr(depsolver, cmd)(package)) -- cgit v1.2.3-1-g7c22