5de402adba292577389fc4191ef35bc2d33d5f55
[sface.git] / sface / sfidata.py
1 import os
2 import pickle
3 from PyQt4.QtCore import *
4 from PyQt4.QtGui import *
5
6 from lxml import etree
7 from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord, UserRecord
8 from sfa.rspecs.rspec_parser import parse_rspec
9 from sface.config import config
10
11 class SfiData:
12     def __init__(self):
13         pass
14
15     def getAuthorityHrns(self, type=None):
16         names = []
17         if os.path.exists(config.getAuthorityListFile()):
18             xml = open(config.getAuthorityListFile()).read()
19             tree = etree.fromstring(xml)
20             records = tree.xpath("//recordlist/record")
21
22             for record in records:
23                 recType = record.attrib.get("type", None)
24                 recHrn = record.attrib.get("hrn", None)
25                 if (type==None) or (type==recType):
26                     names.append(recHrn)
27
28         return names
29
30     def getSliceRecord(self):
31         rec_file = config.getSliceRecordFile()
32         if os.path.exists(rec_file):
33             xml = open(rec_file).read()
34             rec = SliceRecord()
35             rec.load_from_string(xml)
36             return rec
37         return None
38
39     def getUserRecord(self):
40         rec_file = config.getUserRecordFile()
41         if os.path.exists(rec_file):
42             xml = open(rec_file).read()
43             rec = UserRecord()
44             rec.load_from_string(xml)
45             return rec
46         return None
47
48     def getUserSliceHrns(self):
49         rec = self.getUserRecord()
50         if rec:
51             return rec.get_field("slices")
52
53         return []
54
55     def purgeNonSliceResources(self, rspec):
56         # This can probably go away once the new slice manager is fully
57         # deployed.
58         networks = rspec.get_networks()
59         for network in networks:
60             all_nodes = rspec.get_nodes(network)
61             sliver_nodes = rspec.get_nodes_with_slivers(network)
62             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
63
64             for node in available_nodes:
65                 node_elem = rspec.get_node_element(node, network)
66                 parent = node_elem.xpath("..")[0]
67                 parent.remove(node_elem)
68
69     def getSliceRSpec(self):
70         rspec_file = config.getSliceRSpecFile()
71         if os.path.exists(rspec_file):
72             xml = open(rspec_file).read()
73             rspec = parse_rspec(xml)
74
75             self.purgeNonSliceResources(rspec)
76
77             return rspec
78         return None
79
80     def getResourcesRSpec(self):
81         rspec_file = config.getResourcesRSpecFile()
82         if os.path.exists(rspec_file):
83             xml = open(rspec_file).read()
84             return parse_rspec(xml)
85         return None
86
87     def getSliverStatus(self, slice=None):
88         if not slice:
89             slice = config.getSlice()
90
91         filename = config.fullpath(slice+".sliverstatus")
92
93         if os.path.exists(filename):
94             data = open(filename).read()
95             return pickle.loads(data)
96
97         return None
98
99