3 from PyQt4.QtCore import *
4 from PyQt4.QtGui import *
7 from sfa.util.xrn import hrn_to_urn, urn_to_hrn
8 from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord, UserRecord
9 from sfa.rspecs.rspec import RSpec
10 from sface.config import config
13 # temporary, until these references are tracked down and replaced with
16 class SfaceRSpec(RSpec):
17 def __init__(self, rspec="", version=None, user_options={}):
18 RSpec.__init__(self, rspec, version, user_options)
20 def get_networks(self):
21 return self.version.get_networks()
23 def get_nodes(self, network):
24 return self.version.get_nodes(network)
26 def get_nodes_with_slivers(self, network):
27 return self.version.get_nodes_with_slivers(network)
29 def get_node_element(self, node, network=None):
30 return self.version.get_node_element(node, network)
32 def get_default_sliver_attributes(self, network):
33 return self.version.get_default_sliver_attributes(network)
35 def get_sliver_attributes(self, node, network):
36 return self.version.get_sliver_attributes(node, network)
38 def remove_slivers(self, slivers, network=None, no_dupes=False):
39 return self.version.remove_slivers(slivers, network, no_dupes)
41 def add_default_sliver_attribute(self, name, value, network=None):
42 self.version.add_default_sliver_attribute(name, value, network)
44 def add_sliver_attribute(self, hostname, name, value, network=None):
45 self.version.add_sliver_attribute(hostname, name, value, network)
47 def remove_default_sliver_attribute(self, name, value, network=None):
48 self.version.remove_default_sliver_attribute(name, value, network)
50 def remove_sliver_attribute(self, hostname, name, value, network=None):
51 self.version.remove_sliver_attribute(hostname, name, value, network)
53 #def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
54 # return self.version.add_slivers(slivers, network, sliver_urn, no_dupes)
56 def merge_node(self, source_node_tag, network, no_dupes=False):
57 return self.version.merge_node(source_node_tag, network, no_dupes)
59 # sfav1.add_slivers isn't working for us...
60 def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
61 # add slice name to network tag
62 network_tags = self.xml.xpath('//network')
64 network_tag = network_tags[0]
65 network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
68 for sliver in slivers:
69 node_elem = self.get_node_element(sliver['hostname'], network)
70 if not node_elem: continue
71 sliver_elem = etree.SubElement(node_elem, 'sliver')
73 for tag in sliver['tags']:
74 etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
76 # these should be moved to SFAv1, etc.
77 def get_node_boot_state(self, node, network):
78 return self.get_node_element(node, network).attrib.get("boot_state","")
80 def get_node_sliver_type(self, node, network):
81 node = self.get_node_element(node, network)
85 sliver_types = node.xpath("sliver_type")
86 if len(sliver_types)>0:
87 return sliver_types[0].attrib.get("name", "")
95 def getAuthorityHrns(self, type=None):
97 if os.path.exists(config.getAuthorityListFile()):
98 xml = open(config.getAuthorityListFile()).read()
99 tree = etree.fromstring(xml)
100 records = tree.xpath("//recordlist/record")
102 for record in records:
103 recType = record.attrib.get("type", None)
104 recHrn = record.attrib.get("hrn", None)
105 if (type==None) or (type==recType):
110 def getSliceRecord(self):
111 rec_file = config.getSliceRecordFile()
112 if os.path.exists(rec_file):
113 xml = open(rec_file).read()
115 rec.load_from_string(xml)
119 def getUserRecord(self):
120 rec_file = config.getUserRecordFile()
121 if os.path.exists(rec_file):
122 xml = open(rec_file).read()
124 rec.load_from_string(xml)
128 def getUserSliceHrns(self):
129 rec = self.getUserRecord()
131 slices = rec.get_field("slices")
132 if (type(slices)!=list) or (len(slices)<1):
135 # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
136 if (type(slices[0])==dict):
137 if "text" in slices[0]:
138 slices = [x["text"] for x in slices]
144 def purgeNonSliceResources(self, rspec):
145 # This can probably go away once the new slice manager is fully
147 networks = rspec.get_networks()
148 for network in networks:
149 all_nodes = rspec.get_nodes(network)
150 sliver_nodes = rspec.get_nodes_with_slivers(network)
151 available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
153 for node in available_nodes:
154 node_elem = rspec.get_node_element(node, network)
155 parent = node_elem.xpath("..")[0]
156 parent.remove(node_elem)
158 def getSliceRSpec(self):
159 rspec_file = config.getSliceRSpecFile()
160 if os.path.exists(rspec_file):
161 xml = open(rspec_file).read()
162 rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
164 self.purgeNonSliceResources(rspec)
169 def getResourcesRSpec(self):
170 rspec_file = config.getResourcesRSpecFile()
171 if os.path.exists(rspec_file):
172 xml = open(rspec_file).read()
173 rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
177 def getSliverStatus(self, slice=None):
179 slice = config.getSlice()
181 filename = config.fullpath(slice+".sliverstatus")
183 if os.path.exists(filename):
184 data = open(filename).read()
185 return pickle.loads(data)
189 def getSliceMgrVersion(self):
190 filename = config.fullpath("slicemgr.version")
192 if os.path.exists(filename):
193 data = open(filename).read()
194 return pickle.loads(data)