diff options
author | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2011-11-03 09:15:12 -0400 |
---|---|---|
committer | Chris St. Pierre <chris.a.st.pierre@gmail.com> | 2011-11-17 08:13:20 -0500 |
commit | 7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf (patch) | |
tree | b7f0b4beedb1331347ea639b7a70c3c08dd3343e | |
parent | 2e1e5c6283a16937c02204d4551bd20c29849a11 (diff) | |
download | bcfg2-7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf.tar.gz bcfg2-7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf.tar.bz2 bcfg2-7d4325f5e12a40b5b8ae8fc85a4e934b94dd1adf.zip |
added support for default/mandatory/optional package groups
-rw-r--r-- | doc/server/plugins/generators/packages.txt | 19 | ||||
-rw-r--r-- | schemas/pkgtype.xsd | 2 | ||||
-rw-r--r-- | schemas/types.xsd | 9 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Packages/Collection.py | 4 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Packages/Source.py | 2 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Packages/Yum.py | 8 | ||||
-rw-r--r-- | src/lib/Server/Plugins/Packages/__init__.py | 8 | ||||
-rwxr-xr-x | src/sbin/bcfg2-yum-helper | 33 |
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)) |