summaryrefslogtreecommitdiffstats
path: root/src/Generator.py
blob: 6fde580a14dbcedc21f1164acecaf917c4593dcd (plain)
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
#!/usr/bin/env python
# $Id$

from Error import GeneratorError, PublishError

from syslog import syslog, LOG_ERR

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 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