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
|
#!/usr/bin/env python
from threading import Lock
from Error import NodeConfigurationError
'''This file stores persistent metadata for the BCFG Configuration Repository'''
class NodeStatistics(object):
'''Statistics type for Nodes.
self.last => time of last successful run
self.status => final status of last run
self.changeset -> the id of the last config successfully configured
self.count => number of times client run
self.fail => failure count'''
def __init__(self):
self.last = 0
self.status = False
self.changeset = 0
self.count = 0
self.fail = 0
def Suceed(self,changeset):
self.count += 1
self.last = localtime()
self.status = True
self.changeset=changeset
def Fail(self,changeset):
self.count += 1
self.fail += 1
self.status = False
class Client(object):
def __init__(self,name,image,tags):
self.name = name
self.image = image
self.tags = tags
self.stats = NodeStatistics()
self.dirty = []
def UpdateStats(self,status,changeset):
if status:
self.stats.Succeed(changeset)
else:
self.stats.Fail(changeset)
class ConfigurationRegion(object):
def __init__(self,name,scope,stype):
self.name = name
self.scope = scope
self.stype = stype
class Store(object):
def __init__(self):
self.clients = {}
self.default = {}
self.bundles = {}
self.mappings = {}
self.rw = Lock()
self.r = Lock()
def __getstate__(self):
d=self.__dict__.copy()
del d['rw'], d['r']
return d
def __setstate__(self,d):
self.__dict__=d
self.rw=Lock()
self.r=Lock()
def GetImage(self,node):
try:
return self.nodes[node].image
except NodeConfigurationError, e:
self.nodes[node]=Node(node,self.default['image'],self.default['tags'])
return self.nodes[node].image
def GetTags(self,node):
try:
return self.nodes[node].tags
except NodeConfigurationError, e:
self.nodes[node]=Node(node,self.default['image'],self.default['tags'])
return self.nodes[node].image
def AddTag(self,node,tag):
if GetTags(node).count(tag) == 0:
self.nodes[node].tags.append(tag)
def DelTag(self,node,tag):
if GetTags(node).count(tag) != 0:
self.nodes[node].tags.remove(tag)
def GetBundles(self,tag):
return self.bundles.get(tag,[])
def GetNodeBundles(self,node):
ret = {}
for tag in self.GetTags(node):
for bundle in self.GetBundles(tag):
ret[bundle]=True
return ret.keys()
|