41b904f7c949873e830a9ea3b18e4f3f8428d112
[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.xrn import hrn_to_urn, urn_to_hrn
8 from sfa.util.record import SfaRecord, SliceRecord, AuthorityRecord, UserRecord
9 from sfa.rspecs.rspec import RSpec
10 from sface.config import config
11
12 # SfaceRSpec
13 # temporary, until these references are tracked down and replaced with
14 # rspec.version
15
16 class SfaceRSpec(RSpec):
17     def __init__(self, rspec="", version=None, user_options={}):
18         RSpec.__init__(self, rspec, version, user_options)
19
20     def get_networks(self):
21         return self.version.get_networks()
22
23     def get_nodes(self, network):
24         return self.version.get_nodes(network)
25
26     def get_nodes_with_slivers(self, network):
27         return self.version.get_nodes_with_slivers(network)
28
29     def get_node_element(self, node, network=None):
30         return self.version.get_node_element(node, network)
31
32     def get_default_sliver_attributes(self, network):
33         return self.version.get_default_sliver_attributes(network)
34
35     def get_sliver_attributes(self, node, network):
36         return self.version.get_sliver_attributes(node, network)
37
38     def remove_slivers(self, slivers, network=None, no_dupes=False):
39         return self.version.remove_slivers(slivers, network, no_dupes)
40
41     def add_default_sliver_attribute(self, name, value, network=None):
42         self.version.add_default_sliver_attribute(name, value, network)
43
44     def add_sliver_attribute(self, hostname, name, value, network=None):
45         self.version.add_sliver_attribute(hostname, name, value, network)
46
47     def remove_default_sliver_attribute(self, name, value, network=None):
48         self.version.remove_default_sliver_attribute(name, value, network)
49
50     def remove_sliver_attribute(self, hostname, name, value, network=None):
51         self.version.remove_sliver_attribute(hostname, name, value, network)
52
53     #def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
54     #    return self.version.add_slivers(slivers, network, sliver_urn, no_dupes)
55
56     def merge_node(self, source_node_tag, network, no_dupes=False):
57         return self.version.merge_node(source_node_tag, network, no_dupes)
58
59     # sfav1.add_slivers isn't working for us...
60     def add_slivers_xxx(self, slivers, network=None, sliver_urn=None, no_dupes=False):
61         # add slice name to network tag
62         network_tags = self.xml.xpath('//network')
63         if network_tags:
64             network_tag = network_tags[0]
65             network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
66
67         # add slivers
68         for sliver in slivers:
69             node_elem = self.get_node_element(sliver['hostname'], network)
70             if not node_elem: continue
71             sliver_elem = etree.SubElement(node_elem, 'sliver')
72             if 'tags' in sliver:
73                 for tag in sliver['tags']:
74                     etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
75
76     def get_node_sliver_type(self, node, network):
77         node = self.get_node_element(node, network)
78         if node is None:
79             return ""
80
81         sliver_types = node.xpath("sliver_type")
82         if len(sliver_types)>0:
83             return sliver_types[0].attrib.get("name", "")
84
85         return ""
86
87 class SfiData:
88     def __init__(self):
89         pass
90
91     def getAuthorityHrns(self, type=None):
92         names = []
93         if os.path.exists(config.getAuthorityListFile()):
94             xml = open(config.getAuthorityListFile()).read()
95             tree = etree.fromstring(xml)
96             records = tree.xpath("//recordlist/record")
97
98             for record in records:
99                 recType = record.attrib.get("type", None)
100                 recHrn = record.attrib.get("hrn", None)
101                 if (type==None) or (type==recType):
102                     names.append(recHrn)
103
104         return names
105
106     def getSliceRecord(self):
107         rec_file = config.getSliceRecordFile()
108         if os.path.exists(rec_file):
109             xml = open(rec_file).read()
110             rec = SliceRecord()
111             rec.load_from_string(xml)
112             return rec
113         return None
114
115     def getUserRecord(self):
116         rec_file = config.getUserRecordFile()
117         if os.path.exists(rec_file):
118             xml = open(rec_file).read()
119             rec = UserRecord()
120             rec.load_from_string(xml)
121             return rec
122         return None
123
124     def getUserSliceHrns(self):
125         rec = self.getUserRecord()
126         if rec:
127             slices = rec.get_field("slices")
128             if (type(slices)!=list) or (len(slices)<1):
129                 return []
130
131             # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
132             if (type(slices[0])==dict):
133                 if "text" in slices[0]:
134                     slices = [x["text"] for x in slices]
135
136             return slices
137
138         return []
139
140     def purgeNonSliceResources(self, rspec):
141         # This can probably go away once the new slice manager is fully
142         # deployed.
143         networks = rspec.get_networks()
144         for network in networks:
145             all_nodes = rspec.get_nodes(network)
146             sliver_nodes = rspec.get_nodes_with_slivers(network)
147             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
148
149             for node in available_nodes:
150                 node_elem = rspec.get_node_element(node, network)
151                 parent = node_elem.xpath("..")[0]
152                 parent.remove(node_elem)
153
154     def getSliceRSpec(self):
155         rspec_file = config.getSliceRSpecFile()
156         if os.path.exists(rspec_file):
157             xml = open(rspec_file).read()
158             rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
159
160             #self.purgeNonSliceResources(rspec)
161
162             return rspec
163         return None
164
165     def getResourcesRSpec(self):
166         rspec_file = config.getResourcesRSpecFile()
167         if os.path.exists(rspec_file):
168             xml = open(rspec_file).read()
169             rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
170             return rspec
171         return None
172
173     def getSliverStatus(self, slice=None):
174         if not slice:
175             slice = config.getSlice()
176
177         filename = config.fullpath(slice+".sliverstatus")
178
179         if os.path.exists(filename):
180             data = open(filename).read()
181             return pickle.loads(data)
182
183         return None
184
185     def getSliceMgrVersion(self):
186         filename = config.fullpath("slicemgr.version")
187
188         if os.path.exists(filename):
189             data = open(filename).read()
190             return pickle.loads(data)
191
192         return None
193