summaryrefslogtreecommitdiffstats
path: root/src/Generator.py
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2003-12-29 03:52:16 +0000
committerNarayan Desai <desai@mcs.anl.gov>2003-12-29 03:52:16 +0000
commit0e049f5adc2985db16b2db9446f1bda8468c04e5 (patch)
tree0b9ebf2d5a580b95a85d2bd00188607a5a627b8b /src/Generator.py
parentf3b3fb27678a57b9d389be17af25f8a720686a14 (diff)
downloadbcfg2-0e049f5adc2985db16b2db9446f1bda8468c04e5.tar.gz
bcfg2-0e049f5adc2985db16b2db9446f1bda8468c04e5.tar.bz2
bcfg2-0e049f5adc2985db16b2db9446f1bda8468c04e5.zip
API update
2003/12/28 17:02:52-06:00 (none)!desai initial Generator class (Logical change 1.7) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@24 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/Generator.py')
-rw-r--r--src/Generator.py90
1 files changed, 82 insertions, 8 deletions
diff --git a/src/Generator.py b/src/Generator.py
index ef7fa72e2..8c773548d 100644
--- a/src/Generator.py
+++ b/src/Generator.py
@@ -1,18 +1,31 @@
#!/usr/bin/env python
+# $Id$
+
+from syslog import syslog, LOG_ERR
class GeneratorError(Exception):
pass
class Generator(object):
- '''This is a class that generators can be subclassed off of.'''
+ '''This is a class that generators can be subclassed from.
+ __name__, __version__, and __author__ must be set for the module
+ __build__ is a dictionary mapping filename to generator function
+ __requires__ is a set of external published data needed for operation'''
+
__name__ = None
- __version__ = '$Id: $'
- __datastore__ = '/tmp/data'
+ __version__ = None
+ __datastore__ = '/home/desai/data/b2'
__build__ = {}
+ __requires__ = []
- def __init__(self):
+ def __init__(self, container):
+ self.container=container
self.data="%s/%s"%(self.__datastore__,self.__name__)
- print "%s loaded"%(self.__name__)
+ self.PublishAll()
+
+ def CompleteSetup(self):
+ self.ReadAll()
+ print "%s loaded"%(self.__version__)
def Cron(self):
'''Cron defines periodic tasks to maintain data coherence'''
@@ -21,16 +34,24 @@ class Generator(object):
def Build(self,filename,client):
'''Build will construct a Config File object for client.'''
if self.__build__.has_key(filename):
- self.__build__[filename](filename,client)
+ return getattr(self,self.__build__[filename])(filename,client)
else:
raise GeneratorError, ("Key",filename)
def Publish(self,key,value):
- pass
+ self.container.Publish(self.__name__,key,value)
- def Fetch(self,key):
+ def PublishAll(self):
pass
+ def Read(self,key):
+ self.container.ReadValue(key)
+
+ def ReadAll(self):
+ self.external = {}
+ for field in self.__requires__:
+ self.external[field] = self.Read(field)
+
def GetMetadata(self,client,field):
'''GetMetadata returns current metadata file client. Field can be one of:
image, tags, bundles'''
@@ -39,3 +60,56 @@ class Generator(object):
def Notify(self,region):
'''Generate change notification for region'''
pass
+
+class PublishError(Exception):
+ pass
+
+class PublishedValue(object):
+ def __init__(self,owner,key,value):
+ self.owner=owner
+ self.key=key
+ self.value=value
+
+ def Update(self,owner,value):
+ if owner != self.owner:
+ raise PublishError, (self.key,owner)
+ self.value=value
+
+class GeneratorContainer(object):
+ def __init__(self):
+ self.pubspace={}
+ self.generators=[]
+ # we need to setup publish, read interface
+ # we need to inventory and setup generators
+ pass
+
+ def PublishValue(self,owner,key,value):
+ if not self.pubspace.has_key(key):
+ # This is a new entry
+ self.pubspace[key]=PublishedValue(owner,key,value)
+ else:
+ # This is an old entry. Update can fai
+ try:
+ self.pubspace[key].Update(owner,value)
+ except PublishError,e:
+ syslog(LOG_ERR, "Publish conflict for %s. Owner %s, Modifier %s"%(key,self.pubspace[key].owner,owner))
+
+ def ReadValue(self,key):
+ if self.pubspace.has_key(key):
+ return self.pubspace[key].value
+ raise KeyError,key
+
+ def LoadGenerators(self,genlist):
+ for generator in genlist:
+ self.generators.append(generator(self))
+ for generator in self.generators:
+ generator.CompleteSetup()
+ self.handles={}
+ for g in self.generators:
+ for f in g.__build__.keys():
+ self.handles[f]=g
+
+ def GetConfigFile(self,filename,client):
+ if self.handles.has_key(filename):
+ return self.handles[filename].Build(filename,client)
+ raise KeyError, filename