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