summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debian/changelog3
-rw-r--r--src/lib/Server/Plugins/Packages/Collection.py35
-rw-r--r--src/lib/Server/Plugins/Packages/__init__.py8
3 files changed, 39 insertions, 7 deletions
diff --git a/debian/changelog b/debian/changelog
index f35a4cfba..084417388 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
bcfg2 (1.2.3-11) UNRELEASED; urgency=low
+ * Plugins/Packages: backported packages_form_entry/_to_entry
* Plugins/PkgVars: new plugin to set various vars per package
- -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 01 Mar 2013 20:52:30 +0100
+ -- Alexander Sulfrian <alex@spline.inf.fu-berlin.de> Fri, 01 Mar 2013 03:29:05 +0100
bcfg2 (1.2.3-9) unstable; urgency=low
diff --git a/src/lib/Server/Plugins/Packages/Collection.py b/src/lib/Server/Plugins/Packages/Collection.py
index d2d8a015d..f5e5bbe02 100644
--- a/src/lib/Server/Plugins/Packages/Collection.py
+++ b/src/lib/Server/Plugins/Packages/Collection.py
@@ -1,5 +1,6 @@
import copy
import logging
+import lxml.etree
import Bcfg2.Server.Plugin
logger = logging.getLogger(__name__)
@@ -156,6 +157,40 @@ class Collection(Bcfg2.Server.Plugin.Debuggable):
""" do any collection-level data setup tasks """
pass
+ def packages_from_entry(self, entry):
+ """ Given a Package or BoundPackage entry, get a list of the
+ package(s) described by it in a format appropriate for passing
+ to :func:`complete`. By default, that's just the name; only
+ the :mod:`Bcfg2.Server.Plugins.Packages.Yum` backend supports
+ versions or other extended data. See :ref:`pkg-objects` for
+ more details.
+
+ :param entry: The XML entry describing the package or packages.
+ :type entry: lxml.etree._Element
+ :returns: list of strings, but see :ref:`pkg-objects`
+ """
+ return [entry.get("name")]
+
+ def packages_to_entry(self, pkglist, entry, config):
+ """ Given a list of package objects as returned by
+ :func:`packages_from_entry` or :func:`complete`, return an XML
+ tree describing the BoundPackage entries that should be
+ included in the client configuration. See :ref:`pkg-objects`
+ for more details.
+
+ :param pkglist: A list of packages as returned by
+ :func:`complete`
+ :type pkglist: list of strings, but see :ref:`pkg-objects`
+ :param entry: The base XML entry to add all of the Package
+ entries to. This should be modified in place.
+ :type entry: lxml.etree._Element
+ """
+ for pkg in pkglist:
+ lxml.etree.SubElement(entry, 'BoundPackage', name=pkg,
+ version=config.get("packages", "version",
+ default="auto"),
+ type=self.ptype, origin='Packages')
+
def complete(self, packagelist, pinnings=None, recommended=None):
'''Build the transitive closure of all package dependencies
diff --git a/src/lib/Server/Plugins/Packages/__init__.py b/src/lib/Server/Plugins/Packages/__init__.py
index 427393ea0..d998f1c8b 100644
--- a/src/lib/Server/Plugins/Packages/__init__.py
+++ b/src/lib/Server/Plugins/Packages/__init__.py
@@ -157,7 +157,7 @@ class Packages(Bcfg2.Server.Plugin.Plugin,
for struct in structures:
for pkg in struct.xpath('//Package | //BoundPackage'):
if pkg.get("name"):
- initial.add(pkg.get("name"))
+ initial.update(collection.packages_from_entry(pkg))
if pkg.get("recommended"):
recommended[pkg.get("name")] = pkg.get("recommended")
@@ -189,11 +189,7 @@ class Packages(Bcfg2.Server.Plugin.Plugin,
self.debug_log("Packages: %d initial, %d complete, %d new" %
(len(initial), len(packages), len(newpkgs)))
newpkgs.sort()
- for pkg in newpkgs:
- lxml.etree.SubElement(independent, 'BoundPackage', name=pkg,
- version=self.config.get("global", "version",
- default="auto"),
- type=collection.ptype, origin='Packages')
+ collection.packages_to_entry(newpkgs, independent, self.config)
def Refresh(self):
'''Packages.Refresh() => True|False\nReload configuration