1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#!/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 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__ = None
__datastore__ = '/home/desai/data/b2'
__build__ = {}
__requires__ = []
def __init__(self, container):
self.container=container
self.data="%s/%s"%(self.__datastore__,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'''
pass
def Build(self,filename,client):
'''Build will construct a Config File object for client.'''
if self.__build__.has_key(filename):
return getattr(self,self.__build__[filename])(filename,client)
else:
raise GeneratorError, ("Key",filename)
def Publish(self,key,value):
self.container.Publish(self.__name__,key,value)
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'''
pass
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
|