summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Metadata.py
diff options
context:
space:
mode:
authorNarayan Desai <desai@mcs.anl.gov>2004-08-11 19:54:35 +0000
committerNarayan Desai <desai@mcs.anl.gov>2004-08-11 19:54:35 +0000
commitedb900aacbd9a82e0b25a61da8fcb89d3063fab0 (patch)
treefe58ef407650b4870c4ec57623085797a442f981 /src/lib/Server/Metadata.py
parentdaba175ee575fa690d5d3ad24b94f0c59611cf22 (diff)
downloadbcfg2-edb900aacbd9a82e0b25a61da8fcb89d3063fab0.tar.gz
bcfg2-edb900aacbd9a82e0b25a61da8fcb89d3063fab0.tar.bz2
bcfg2-edb900aacbd9a82e0b25a61da8fcb89d3063fab0.zip
Rename: src/Metadata.py -> src/lib/Server/Metadata.py
(Logical change 1.33) git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@167 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/Server/Metadata.py')
-rw-r--r--src/lib/Server/Metadata.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/lib/Server/Metadata.py b/src/lib/Server/Metadata.py
index e69de29bb..a824dc022 100644
--- a/src/lib/Server/Metadata.py
+++ b/src/lib/Server/Metadata.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+
+from elementtree.ElementTree import XML
+from threading import Lock
+from time import localtime, mktime
+
+from Error import NodeConfigurationError
+from GeneratorUtils import SingleXMLFileBacked
+
+'''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 GetStats(self):
+ return (self.status, self.count, self.last, self.fail)
+
+ def Suceed(self,changeset):
+ self.count += 1
+ self.last = mktime(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.Suceed(changeset)
+ else:
+ self.stats.Fail(changeset)
+
+ def GetStats(self):
+ return self.stats.GetStats()
+
+class ConfigurationRegion(object):
+ def __init__(self,name,scope,stype):
+ self.name = name
+ self.scope = scope
+ self.stype = stype
+
+class Metadata(object):
+ '''The Metadata class is a container for all classes of metadata used by Bcfg2'''
+ def __init__(self, all, image, classes, bundles, attributes, hostname):
+ self.all = all
+ self.image = image
+ self.classes = classes
+ self.bundles = bundles
+ self.attributes = attributes
+ self.hostname = hostname
+
+ def Applies(self, other):
+ '''Applies checks if the object associated with this metadata is relevant to
+ the metadata supplied by other'''
+ for c in self.classes:
+ if c not in other.classes:
+ return False
+ for bundle in self.bundles:
+ if bundle not in other.bundles:
+ return False
+ if (self.hostname != None) and (self.hostname != other.hostname):
+ return False
+ return True
+
+class MetadataStore(SingleXMLFileBacked):
+ def Index(self):
+ self.clients = {}
+ self.classes = {}
+ self.element = XML(self.data)
+ for c in self.element.findall("Class"):
+ self.classes[c.attrib['name']] = map(lambda x:x.attrib['name'], c.findall(".//Bundle"))
+ for client in self.element.findall('Client'):
+ attributes = map(lambda x:"%s.%s"%(x.attrib['scope'],x.attrib['name']),
+ client.findall(".//Attribute"))
+ classes = map(lambda x:x.attrib['name'], client.findall(".//Class"))
+ bundles = reduce(lambda x,y:x+y, map(lambda z:self.classes.get(z,[]), classes),[])
+ for b in bundles:
+ if bundles.count(b) > 1: bundles.remove(b)
+ self.clients[client.attrib['name']] = Metadata(False, client.attrib['image'], classes,
+ bundles, attributes, client.attrib['name'])