import os import pickle from PyQt4.QtCore import * from PyQt4.QtGui import * from lxml import etree from sfa.util.xrn import hrn_to_urn, urn_to_hrn from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord, UserRecord from sfa.rspecs.rspec import RSpec from sface.config import config # SfaceRSpec # temporary, until these references are tracked down and replaced with # rspec.version class SfaceRSpec(RSpec): def __init__(self, rspec="", version=None, user_options={}): RSpec.__init__(self, rspec, version, user_options) def get_networks(self): return self.version.get_networks() def get_nodes(self, network): return self.version.get_nodes(network) def get_nodes_with_slivers(self, network): return self.version.get_nodes_with_slivers(network) def get_node_element(self, node, network=None): return self.version.get_node_element(node, network) def get_default_sliver_attributes(self, network): return self.version.get_default_sliver_attributes(network) def get_sliver_attributes(self, node, network): return self.version.get_sliver_attributes(node, network) def remove_slivers(self, slivers, network=None, no_dupes=False): return self.version.remove_slivers(slivers, network, no_dupes) def add_default_sliver_attribute(self, name, value, network=None): self.version.add_default_sliver_attribute(name, value, network) def add_sliver_attribute(self, hostname, name, value, network=None): self.version.add_sliver_attribute(hostname, name, value, network) def remove_default_sliver_attribute(self, name, value, network=None): self.version.remove_default_sliver_attribute(name, value, network) def remove_sliver_attribute(self, hostname, name, value, network=None): self.version.remove_sliver_attribute(hostname, name, value, network) #def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False): # return self.version.add_slivers(slivers, network, sliver_urn, no_dupes) def merge_node(self, source_node_tag, network, no_dupes=False): return self.version.merge_node(source_node_tag, network, no_dupes) # sfav1.add_slivers isn't working for us... def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False): # add slice name to network tag network_tags = self.xml.xpath('//network') if network_tags: network_tag = network_tags[0] network_tag.set('slice', urn_to_hrn(sliver_urn)[0]) # add slivers for sliver in slivers: node_elem = self.get_node_element(sliver['hostname'], network) if not node_elem: continue sliver_elem = etree.SubElement(node_elem, 'sliver') if 'tags' in sliver: for tag in sliver['tags']: etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value'] # these should be moved to SFAv1, etc. def get_node_boot_state(self, node, network): return self.get_node_element(node, network).attrib.get("boot_state","") def get_node_sliver_type(self, node, network): node = self.get_node_element(node, network) if not node: return "" sliver_types = node.xpath("sliver_type") if len(sliver_types)>0: return sliver_types[0].attrib.get("name", "") return "" class SfiData: def __init__(self): pass def getAuthorityHrns(self, type=None): names = [] if os.path.exists(config.getAuthorityListFile()): xml = open(config.getAuthorityListFile()).read() tree = etree.fromstring(xml) records = tree.xpath("//recordlist/record") for record in records: recType = record.attrib.get("type", None) recHrn = record.attrib.get("hrn", None) if (type==None) or (type==recType): names.append(recHrn) return names def getSliceRecord(self): rec_file = config.getSliceRecordFile() if os.path.exists(rec_file): xml = open(rec_file).read() rec = SliceRecord() rec.load_from_string(xml) return rec return None def getUserRecord(self): rec_file = config.getUserRecordFile() if os.path.exists(rec_file): xml = open(rec_file).read() rec = UserRecord() rec.load_from_string(xml) return rec return None def getUserSliceHrns(self): rec = self.getUserRecord() if rec: return rec.get_field("slices") return [] def purgeNonSliceResources(self, rspec): # This can probably go away once the new slice manager is fully # deployed. networks = rspec.get_networks() for network in networks: all_nodes = rspec.get_nodes(network) sliver_nodes = rspec.get_nodes_with_slivers(network) available_nodes = [ node for node in all_nodes if node not in sliver_nodes ] for node in available_nodes: node_elem = rspec.get_node_element(node, network) parent = node_elem.xpath("..")[0] parent.remove(node_elem) def getSliceRSpec(self): rspec_file = config.getSliceRSpecFile() if os.path.exists(rspec_file): xml = open(rspec_file).read() rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml) self.purgeNonSliceResources(rspec) return rspec return None def getResourcesRSpec(self): rspec_file = config.getResourcesRSpecFile() if os.path.exists(rspec_file): xml = open(rspec_file).read() rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml) return rspec return None def getSliverStatus(self, slice=None): if not slice: slice = config.getSlice() filename = config.fullpath(slice+".sliverstatus") if os.path.exists(filename): data = open(filename).read() return pickle.loads(data) return None def getSliceMgrVersion(self): filename = config.fullpath("slicemgr.version") if os.path.exists(filename): data = open(filename).read() return pickle.loads(data) return None