f4c872ceb54ae403ffd4f5aeea5f028c1a9854c9
[sface.git] / sface / sfidata.py
1 import json
2 import os
3 import pickle
4 from PyQt4.QtCore import *
5 from PyQt4.QtGui import *
6
7 from lxml import etree
8 from sfa.util.xrn import hrn_to_urn, urn_to_hrn
9 from sfa.rspecs.rspec import RSpec
10 from sface.config import config
11
12 class SfiData:
13     def __init__(self):
14         pass
15
16     def getAuthorityHrns(self, type=None):
17         names = []
18         if os.path.exists(config.getAuthorityListFile()):
19             xml = open(config.getAuthorityListFile()).read()
20             tree = etree.fromstring(xml)
21             records = tree.xpath("//recordlist/record")
22
23             for record in records:
24                 recType = record.attrib.get("type", None)
25                 recHrn = record.attrib.get("hrn", None)
26                 if (type==None) or (type==recType):
27                     names.append(recHrn)
28
29         return names
30
31     def getRecord(self, rec_file):
32         if os.path.exists(rec_file):
33             from sfa.storage.record import Record
34             xml = open(rec_file).read()
35             rec = Record(xml=xml)
36             return rec.todict()
37         return None         
38
39     def getSliceRecord(self):
40         rec_file = config.getSliceRecordFile()
41         return self.getRecord(rec_file)
42
43     def getUserRecord(self):
44         rec_file = config.getUserRecordFile()
45         return self.getRecord(rec_file)
46
47     def getUserSliceHrns(self):
48         rec = self.getUserRecord()
49         if rec:
50             slices = rec.get("slices",[])
51             if (type(slices)!=list) or (len(slices)<1):
52                 return []
53
54             # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
55             if (type(slices[0])==dict):
56                 if "text" in slices[0]:
57                     slices = [x["text"] for x in slices]
58
59             return slices
60
61         return []
62
63     def purgeNonSliceResources(self, rspec):
64         # This can probably go away once the new slice manager is fully
65         # deployed.
66         networks = rspec.get_networks()
67         for network in networks:
68             all_nodes = rspec.get_nodes(network)
69             sliver_nodes = rspec.get_nodes_with_slivers(network)
70             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
71
72             for node in available_nodes:
73                 node_elem = rspec.get_node_element(node, network)
74                 parent = node_elem.xpath("..")[0]
75                 parent.remove(node_elem)
76
77     def getSliceRSpec(self):
78         rspec_file = config.getSliceRSpecFile()
79         if os.path.exists(rspec_file):
80             xml = open(rspec_file).read()
81
82             if (xml.strip()==""):
83                return None
84
85             rspec = RSpec(rspec=xml)
86
87             return rspec
88         return None
89
90     def getResourcesRSpec(self):
91         rspec_file = config.getResourcesRSpecFile()
92         if os.path.exists(rspec_file):
93             xml = open(rspec_file).read()
94
95             if (xml.strip()==""):
96                 return None
97
98             rspec = RSpec(rspec=xml)
99             return rspec
100         return None
101
102     def getSliverStatus(self, slice=None):
103         if not slice:
104             slice = config.getSlice()
105
106         if not slice:
107             return None
108
109         filename = config.fullpath(slice+".sliverstatus")
110
111         if os.path.exists(filename):
112             data = open(filename).read()
113             try:
114                 if hasattr(json, "loads"):
115                      return json.loads(data)   # python 2.6
116                 else:
117                      return json.read(data)    # python 2.5
118             except:
119                 print "Exception in getSliverStatus"
120                 return None
121
122         return None
123
124     def getSliceMgrVersion(self):
125         filename = config.fullpath("slicemgr.version")
126
127         if os.path.exists(filename):
128             data = open(filename).read()
129             return pickle.loads(data)
130
131         return None
132