/
rackbuilder.py
78 lines (70 loc) · 1.97 KB
/
rackbuilder.py
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
#!/usr/bin/python
import sys, string
from xml.dom import minidom, Node
import rack
class RackBuilder:
def __init__(self):
pass
def build(self, dom):
rootNode = dom.documentElement
try:
units = rootNode.attributes.get('units').nodeValue
except AttributeError:
units = 47
r = rack.Rack('rack', {}, units)
for attrName in rootNode.attributes.keys():
aNode = rootNode.attributes.get(attrName)
aValue = aNode.nodeValue
try:
setattr(r, attrName, aValue)
except AttributeError, ex:
print >> sys.stderr, "error setting %s to %s" % (attrName, aValue)
raise ex
for c in self.walk(rootNode):
r += c
return r
def walk(self, parent):
things = []
for node in parent.childNodes:
if node.nodeType == Node.ELEMENT_NODE:
if node.nodeName == "rackmount":
e = rack.Rackmount()
elif node.nodeName == "cablemanagement":
e = rack.CableManagement()
elif node.nodeName == "switch":
e = rack.Switch()
elif node.nodeName == "shelf":
e = rack.ShelfThin()
elif node.nodeName == "box":
e = rack.Box()
elif node.nodeName == "apc":
e = rack.APC()
elif node.nodeName == "gap":
e = rack.Gap()
else:
raise NotImplementedError, "no handler for a %s" % node.nodeName
# Walk the child nodes.
for c in self.walk(node):
e += c
try:
print "element %s is %s units" % (e.__class__.__name__, e.units)
except AttributeError:
pass
attrs = node.attributes # [2]
for attrName in attrs.keys():
attrNode = attrs.get(attrName)
attrValue = attrNode.nodeValue
try:
setattr(e, attrName, attrValue)
except AttributeError, ex:
print >> sys.stderr, "error setting %s to %s" % (attrName, attrValue)
raise ex
things.append(e)
# My, Earth sure has a lot of things.
#print things
return things
if __name__ == '__main__':
dom = minidom.parse("example.feng")
r = RackBuilder().build(dom)
import rack2ps
#print rack2ps.RackView("x").render(r)