summaryrefslogtreecommitdiffstats
path: root/src/Metadata.py
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2003-11-25 20:31:09 +0000
committerNarayan Desai <desai@mcs.anl.gov>2003-11-25 20:31:09 +0000
commitd40fd4f9fcbfc35393a0e2f7ad87b06a9c4ff34b (patch)
treee4f3d3093502b9ee0f25fb6a84d3681ba230d251 /src/Metadata.py
parentae621612f78837dc2052be3f813cfcb915ce83a1 (diff)
downloadbcfg2-d40fd4f9fcbfc35393a0e2f7ad87b06a9c4ff34b.tar.gz
bcfg2-d40fd4f9fcbfc35393a0e2f7ad87b06a9c4ff34b.tar.bz2
bcfg2-d40fd4f9fcbfc35393a0e2f7ad87b06a9c4ff34b.zip
Minor comments and updates
2003/11/25 14:00:51-06:00 (none)!desai make pickleable 2003/11/21 15:58:56-06:00 (none)!desai (Logical change 1.5) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@17 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/Metadata.py')
-rw-r--r--src/Metadata.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/Metadata.py b/src/Metadata.py
index e69de29bb..8de23f8b9 100644
--- a/src/Metadata.py
+++ b/src/Metadata.py
@@ -0,0 +1,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()