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_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
42 # return self.version.add_slivers(slivers, network, sliver_urn, no_dupes)
44 def merge_node(self, source_node_tag, network, no_dupes=False):
45 return self.version.merge_node(source_node_tag, network, no_dupes)
47 # sfav1.add_slivers isn't working for us...
48 def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
49 # add slice name to network tag
50 network_tags = self.xml.xpath('//network')
52 network_tag = network_tags[0]
53 network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
56 for sliver in slivers:
57 node_elem = self.get_node_element(sliver['hostname'], network)
58 if not node_elem: continue
59 sliver_elem = etree.SubElement(node_elem, 'sliver')
61 for tag in sliver['tags']:
62 etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
68 def getAuthorityHrns(self, type=None):
70 if os.path.exists(config.getAuthorityListFile()):
71 xml = open(config.getAuthorityListFile()).read()
72 tree = etree.fromstring(xml)
73 records = tree.xpath("//recordlist/record")
75 for record in records:
76 recType = record.attrib.get("type", None)
77 recHrn = record.attrib.get("hrn", None)
78 if (type==None) or (type==recType):
83 def getSliceRecord(self):
84 rec_file = config.getSliceRecordFile()
85 if os.path.exists(rec_file):
86 xml = open(rec_file).read()
88 rec.load_from_string(xml)
92 def getUserRecord(self):
93 rec_file = config.getUserRecordFile()
94 if os.path.exists(rec_file):
95 xml = open(rec_file).read()
97 rec.load_from_string(xml)
101 def getUserSliceHrns(self):
102 rec = self.getUserRecord()
104 return rec.get_field("slices")
108 def purgeNonSliceResources(self, rspec):
109 # This can probably go away once the new slice manager is fully
111 networks = rspec.get_networks()
112 for network in networks:
113 all_nodes = rspec.get_nodes(network)
114 sliver_nodes = rspec.get_nodes_with_slivers(network)
115 available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
117 for node in available_nodes:
118 node_elem = rspec.get_node_element(node, network)
119 parent = node_elem.xpath("..")[0]
120 parent.remove(node_elem)
122 def getSliceRSpec(self):
123 rspec_file = config.getSliceRSpecFile()
124 if os.path.exists(rspec_file):
125 xml = open(rspec_file).read()
126 rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
128 self.purgeNonSliceResources(rspec)
133 def getResourcesRSpec(self):
134 rspec_file = config.getResourcesRSpecFile()
135 if os.path.exists(rspec_file):
136 xml = open(rspec_file).read()
137 rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
141 def getSliverStatus(self, slice=None):
143 slice = config.getSlice()
145 filename = config.fullpath(slice+".sliverstatus")
147 if os.path.exists(filename):
148 data = open(filename).read()
149 return pickle.loads(data)
153 def getSliceMgrVersion(self):
154 filename = config.fullpath("slicemgr.version")
156 if os.path.exists(filename):
157 data = open(filename).read()
158 return pickle.loads(data)