From be0714757cbd4dc4748855e72bcec4476fd07e38 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 1 Nov 2012 00:08:00 +0100 Subject: Packages: add src attribute to package definition using the src attribute, you could pin a package to a named source --- schemas/pkgtype.xsd | 1 + src/lib/Server/Plugins/Packages/Collection.py | 21 ++++++++++++++++++--- src/lib/Server/Plugins/Packages/Yum.py | 8 ++++---- src/lib/Server/Plugins/Packages/__init__.py | 6 +++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/schemas/pkgtype.xsd b/schemas/pkgtype.xsd index 2de44b1d7..c49b4f53b 100644 --- a/schemas/pkgtype.xsd +++ b/schemas/pkgtype.xsd @@ -19,6 +19,7 @@ + diff --git a/src/lib/Server/Plugins/Packages/Collection.py b/src/lib/Server/Plugins/Packages/Collection.py index 32eeda1ec..e0c7e338f 100644 --- a/src/lib/Server/Plugins/Packages/Collection.py +++ b/src/lib/Server/Plugins/Packages/Collection.py @@ -91,10 +91,24 @@ class Collection(Bcfg2.Server.Plugin.Debuggable): return True return False - def get_deps(self, package): + def get_deps(self, package, pinnings=None): + pin_found = False + + pin_source = None + if pinnings and package in pinnings: + pin_source = pinnings[package] + for source in self.sources: + if pin_source and pin_source != source.name: + continue + pin_found = True + if source.is_package(self.metadata, package): return source.get_deps(self.metadata, package) + + if not pin_found: + self.logger.error("Packages: Source '%s' for package '%s' not found" % + (pin_source, package)) return [] def get_provides(self, package): @@ -138,11 +152,12 @@ class Collection(Bcfg2.Server.Plugin.Debuggable): """ do any collection-level data setup tasks """ pass - def complete(self, packagelist): + def complete(self, packagelist, pinnings=None): '''Build the transitive closure of all package dependencies Arguments: packageslist - set of package names + pinnings - mapping from package names to source names returns => (set(packages), set(unsatisfied requirements)) ''' @@ -198,7 +213,7 @@ class Collection(Bcfg2.Server.Plugin.Debuggable): self.debug_log("Packages: handling package requirement %s" % current) packages.add(current) - deps = self.get_deps(current) + deps = self.get_deps(current, pinnings) newdeps = set(deps).difference(examined) if newdeps: self.debug_log("Packages: Package %s added requirements %s" diff --git a/src/lib/Server/Plugins/Packages/Yum.py b/src/lib/Server/Plugins/Packages/Yum.py index 7fe169fc8..8543b44e4 100644 --- a/src/lib/Server/Plugins/Packages/Yum.py +++ b/src/lib/Server/Plugins/Packages/Yum.py @@ -355,9 +355,9 @@ class YumCollection(Collection): # for API completeness return self.call_helper("is_virtual_package", package) - def get_deps(self, package): + def get_deps(self, package, pinnings): if not self.use_yum: - return Collection.get_deps(self, package) + return Collection.get_deps(self, package, pinnings) else: # this should really never get called; it's just provided # for API completeness @@ -383,9 +383,9 @@ class YumCollection(Collection): pkgs = self.call_helper("get_group", dict(group=group, type=ptype)) return pkgs - def complete(self, packagelist): + def complete(self, packagelist, pinnings): if not self.use_yum: - return Collection.complete(self, packagelist) + return Collection.complete(self, packagelist, pinnings) packages = set() unknown = set(packagelist) diff --git a/src/lib/Server/Plugins/Packages/__init__.py b/src/lib/Server/Plugins/Packages/__init__.py index 17a3458bd..637560de5 100644 --- a/src/lib/Server/Plugins/Packages/__init__.py +++ b/src/lib/Server/Plugins/Packages/__init__.py @@ -149,11 +149,15 @@ class Packages(Bcfg2.Server.Plugin.Plugin, initial = set() # base is the set of initial packages with groups expanded base = set() + pinned_src = dict() to_remove = [] for struct in structures: for pkg in struct.xpath('//Package | //BoundPackage'): if pkg.get("name"): initial.add(pkg.get("name")) + + if pkg.get("src"): + pinned_src[pkg.get("name")] = pkg.get("src") elif pkg.get("group"): try: if pkg.get("type"): @@ -174,7 +178,7 @@ class Packages(Bcfg2.Server.Plugin.Plugin, for el in to_remove: el.getparent().remove(el) - packages, unknown = collection.complete(base) + packages, unknown = collection.complete(base, pinned_src) if unknown: self.logger.info("Packages: Got %d unknown entries" % len(unknown)) self.logger.info("Packages: %s" % list(unknown)) -- cgit v1.2.3-1-g7c22