summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/server/plugins/generators/packages.txt19
-rw-r--r--schemas/pkgtype.xsd2
-rw-r--r--schemas/types.xsd9
-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
8 files changed, 70 insertions, 15 deletions
diff --git a/doc/server/plugins/generators/packages.txt b/doc/server/plugins/generators/packages.txt
index f49b12a68..0f4a9bb96 100644
--- a/doc/server/plugins/generators/packages.txt
+++ b/doc/server/plugins/generators/packages.txt
@@ -465,6 +465,25 @@ group name::
<Package group="SNMP Support"/>
<Package group="system-management-snmp"/>
+By default, only those packages considered the "default" packages in a
+group will be installed. You can change this behavior using the
+"type" attribute::
+
+ <Package group="development" type="optional"/>
+ <Package group="Administration Tools" type="mandatory"/>
+
+Valid values of "type" are:
+
+* ``mandatory``: Only install mandatory packages in the group.
+* ``default``: Install default packages from the group (the default).
+* ``optional`` or ``all``: Install all packages in the group,
+ including mandatory, default, and optional packages.
+
+You can view the packages in a group by category with the ``yum
+groupinfo`` command. More information about the different levels can
+be found at
+http://fedoraproject.org/wiki/How_to_use_and_edit_comps.xml_for_package_groups#Installation
+
.. _pulp-source-support:
Pulp Support
diff --git a/schemas/pkgtype.xsd b/schemas/pkgtype.xsd
index 23768e518..83e3f0e48 100644
--- a/schemas/pkgtype.xsd
+++ b/schemas/pkgtype.xsd
@@ -17,6 +17,8 @@
<xsd:attribute type="xsd:string" name="name"/>
<xsd:attribute type="xsd:string" name="group"/>
<xsd:attribute type="xsd:string" name="verify" use="optional"/>
+ <xsd:attribute type="PackageGroupTypeEnum" name="type"
+ use="optional"/>
<xsd:attributeGroup ref="py:genshiAttrs"/>
</xsd:complexType>
diff --git a/schemas/types.xsd b/schemas/types.xsd
index dde7a856b..689e693b7 100644
--- a/schemas/types.xsd
+++ b/schemas/types.xsd
@@ -21,6 +21,15 @@
</xsd:restriction>
</xsd:simpleType>
+ <xsd:simpleType name="PackageGroupTypeEnum">
+ <xsd:restriction base="xsd:string">
+ <xsd:enumeration value="optional"/>
+ <xsd:enumeration value="default"/>
+ <xsd:enumeration value="mandatory"/>
+ <xsd:enumeration value="all"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
<xsd:simpleType name='PathTypeEnum'>
<xsd:restriction base='xsd:string'>
<xsd:enumeration value='device' />
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))