From c4154ca4d2b7b2a7bcc266d3f473ff1d247cac9f Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Wed, 19 Oct 2011 10:14:43 -0400 Subject: Various Packages plugin fixes: * Added bcfg2-yum-helper to offload Yum API calls to a short-lived process. As absurd as this is, it appears to be the standard way to get around Yum's atrocious memory handling (cf. yum-updatesd). * Added SourceInitError for non-fatal errors instantiating new sources. * Fixed bug that caused all cached data to be removed on server startup (reported by mikemccllstr on IRC). * Fixed a number of overly aggressive caching issues. * Fixed the way sources are loaded at server startup. * Fixed handling of Yum package groups. --- src/lib/Server/Plugins/Packages/PackagesSources.py | 31 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'src/lib/Server/Plugins/Packages/PackagesSources.py') diff --git a/src/lib/Server/Plugins/Packages/PackagesSources.py b/src/lib/Server/Plugins/Packages/PackagesSources.py index 6d0b1d732..4fbccab30 100644 --- a/src/lib/Server/Plugins/Packages/PackagesSources.py +++ b/src/lib/Server/Plugins/Packages/PackagesSources.py @@ -3,10 +3,10 @@ import sys import lxml.etree import logging import Bcfg2.Server.Plugin +from Bcfg2.Server.Plugins.Packages.Source import SourceInitError logger = logging.getLogger("Packages") - class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, Bcfg2.Server.Plugin.StructFile): __identifier__ = None @@ -30,8 +30,19 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, # create cache directory if needed os.makedirs(self.cachepath) self.pkg_obj = packages + self.parsed = set() self.loaded = False + def HandleEvent(self, event=None): + Bcfg2.Server.Plugin.SingleXMLFileBacked.HandleEvent(self, event=event) + if event.filename != self.name: + self.parsed.add(os.path.basename(event.filename)) + + if sorted(list(self.parsed)) == sorted(self.extras): + logger.info("Reloading Packages plugin") + self.pkg_obj.Reload() + self.loaded = True + def Index(self): Bcfg2.Server.Plugin.SingleXMLFileBacked.Index(self) self.entries = [] @@ -40,9 +51,6 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, if source is not None: self.entries.append(source) - self.pkg_obj.Reload() - self.loaded = True - def source_from_xml(self, xsource): """ create a *Source object from its XML representation in sources.xml """ @@ -60,7 +68,20 @@ class PackagesSources(Bcfg2.Server.Plugin.SingleXMLFileBacked, logger.error("Packages: Unknown source type %s" % stype) return None - return cls(self.cachepath, xsource, self.config) + try: + source = cls(self.cachepath, xsource, self.config) + except SourceInitError: + err = sys.exc_info()[1] + logger.error("Packages: %s" % err) + source = None + + return source def __getitem__(self, key): return self.entries[key] + + def __repr__(self): + return "PackagesSources: %s" % repr(self.entries) + + def __str__(self): + return "PackagesSources: %s" % str(self.entries) -- cgit v1.2.3-1-g7c22