can run against library 2.0 or 2.1 (sqlalchemy) that has a new interface for dealing...
[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 getSliceRecord(self):
32         rec_file = config.getSliceRecordFile()
33         if os.path.exists(rec_file):
34             try:
35                 from sfa.storage.record import SliceRecord
36                 xml = open(rec_file).read()
37                 rec = SliceRecord()
38                 rec.load_from_string(xml)
39                 return rec
40             except:
41                 from sfa.storage.model import make_record
42                 obj=make_record (xml=file(rec_file).read())
43                 # consider as a dict for smooth transition
44                 return obj.__dict__
45         return None
46
47     def getUserRecord(self):
48         rec_file = config.getUserRecordFile()
49         if os.path.exists(rec_file):
50             try:
51                 from sfa.storage.record import SliceUser
52                 xml = open(rec_file).read()
53                 rec = UserRecord()
54                 rec.load_from_string(xml)
55                 return rec
56             except:
57                 from sfa.storage.model import make_record
58                 obj=make_record (xml=file(rec_file).read())
59                 # consider as a dict for smooth transition
60                 return obj.__dict__
61         return None
62
63     def getUserSliceHrns(self):
64         rec = self.getUserRecord()
65         if rec:
66             slices = rec.get_field("slices")
67             if (type(slices)!=list) or (len(slices)<1):
68                 return []
69
70             # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
71             if (type(slices[0])==dict):
72                 if "text" in slices[0]:
73                     slices = [x["text"] for x in slices]
74
75             return slices
76
77         return []
78
79     def purgeNonSliceResources(self, rspec):
80         # This can probably go away once the new slice manager is fully
81         # deployed.
82         networks = rspec.get_networks()
83         for network in networks:
84             all_nodes = rspec.get_nodes(network)
85             sliver_nodes = rspec.get_nodes_with_slivers(network)
86             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
87
88             for node in available_nodes:
89                 node_elem = rspec.get_node_element(node, network)
90                 parent = node_elem.xpath("..")[0]
91                 parent.remove(node_elem)
92
93     def getSliceRSpec(self):
94         rspec_file = config.getSliceRSpecFile()
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
103             return rspec
104         return None
105
106     def getResourcesRSpec(self):
107         rspec_file = config.getResourcesRSpecFile()
108         if os.path.exists(rspec_file):
109             xml = open(rspec_file).read()
110
111             if (xml.strip()==""):
112                 return None
113
114             rspec = RSpec(rspec=xml)
115             return rspec
116         return None
117
118     def getSliverStatus(self, slice=None):
119         if not slice:
120             slice = config.getSlice()
121
122         if not slice:
123             return None
124
125         filename = config.fullpath(slice+".sliverstatus")
126
127         if os.path.exists(filename):
128             data = open(filename).read()
129             try:
130                 if hasattr(json, "loads"):
131                      return json.loads(data)   # python 2.6
132                 else:
133                      return json.read(data)    # python 2.5
134             except:
135                 print "Exception in getSliverStatus"
136                 return None
137
138         return None
139
140     def getSliceMgrVersion(self):
141         filename = config.fullpath("slicemgr.version")
142
143         if os.path.exists(filename):
144             data = open(filename).read()
145             return pickle.loads(data)
146
147         return None
148