summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2011-11-03 09:15:12 -0400
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2011-11-17 08:13:20 -0500
commit7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf (patch)
treeb7f0b4beedb1331347ea639b7a70c3c08dd3343e /src
parent2e1e5c6283a16937c02204d4551bd20c29849a11 (diff)
downloadbcfg2-7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf.tar.gz
bcfg2-7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf.tar.bz2
bcfg2-7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf.zip
added support for default/mandatory/optional package groups
Diffstat (limited to 'src')
-rw-r--r--src/lib/Server/Plugins/Packages/Collection.py4
-rw-r--r--src/lib/Server/Plugins/Packages/Source.py2
-rw-r--r--src/lib/Server/Plugins/Packages/Yum.py8
-rw-r--r--src/lib/Server/Plugins/Packages/__init__.py8
-rwxr-xr-xsrc/sbin/bcfg2-yum-helper33
5 files changed, 40 insertions, 15 deletions
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))