summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2012-11-01 00:08:00 +0100
committerAlexander Sulfrian <alexander@sulfrian.net>2013-01-30 01:22:51 +0100
commitbe0714757cbd4dc4748855e72bcec4476fd07e38 (patch)
treeae7701cd7e5021148fe8d67be4ed4ca8addfc3ab
parent782b72a67360882c7637ab3be4b5e7f62e01cbe6 (diff)
downloadbcfg2-be0714757cbd4dc4748855e72bcec4476fd07e38.tar.gz
bcfg2-be0714757cbd4dc4748855e72bcec4476fd07e38.tar.bz2
bcfg2-be0714757cbd4dc4748855e72bcec4476fd07e38.zip
Packages: add src attribute to package definition
using the src attribute, you could pin a package to a named source
-rw-r--r--schemas/pkgtype.xsd1
-rw-r--r--src/lib/Server/Plugins/Packages/Collection.py21
-rw-r--r--src/lib/Server/Plugins/Packages/Yum.py8
-rw-r--r--src/lib/Server/Plugins/Packages/__init__.py6
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 @@
<xsd:attribute type="xsd:string" name="verify" use="optional"/>
<xsd:attribute type="PackageGroupTypeEnum" name="type"
use="optional"/>
+ <xsd:attribute type="xsd:string" name="src" use="optional"/>
<xsd:attributeGroup ref="py:genshiAttrs"/>
</xsd:complexType>
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))