a70cb4714182e520513fe34e7f60eaeb9973bcbc
[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(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     # these should be moved to SFAv1, etc.
77     def get_node_boot_state(self, node, network):
78         return self.get_node_element(node, network).attrib.get("boot_state","")
79
80     def get_node_sliver_type(self, node, network):
81         node = self.get_node_element(node, network)
82         if node is None:
83             return ""
84
85         sliver_types = node.xpath("sliver_type")
86         if len(sliver_types)>0:
87             return sliver_types[0].attrib.get("name", "")
88
89         return ""
90
91 class SfiData:
92     def __init__(self):
93         pass
94
95     def getAuthorityHrns(self, type=None):
96         names = []
97         if os.path.exists(config.getAuthorityListFile()):
98             xml = open(config.getAuthorityListFile()).read()
99             tree = etree.fromstring(xml)
100             records = tree.xpath("//recordlist/record")
101
102             for record in records:
103                 recType = record.attrib.get("type", None)
104                 recHrn = record.attrib.get("hrn", None)
105                 if (type==None) or (type==recType):
106                     names.append(recHrn)
107
108         return names
109
110     def getSliceRecord(self):
111         rec_file = config.getSliceRecordFile()
112         if os.path.exists(rec_file):
113             xml = open(rec_file).read()
114             rec = SliceRecord()
115             rec.load_from_string(xml)
116             return rec
117         return None
118
119     def getUserRecord(self):
120         rec_file = config.getUserRecordFile()
121         if os.path.exists(rec_file):
122             xml = open(rec_file).read()
123             rec = UserRecord()
124             rec.load_from_string(xml)
125             return rec
126         return None
127
128     def getUserSliceHrns(self):
129         rec = self.getUserRecord()
130         if rec:
131             slices = rec.get_field("slices")
132             if (type(slices)!=list) or (len(slices)<1):
133                 return []
134
135             # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
136             if (type(slices[0])==dict):
137                 if "text" in slices[0]:
138                     slices = [x["text"] for x in slices]
139
140             return slices
141
142         return []
143
144     def purgeNonSliceResources(self, rspec):
145         # This can probably go away once the new slice manager is fully
146         # deployed.
147         networks = rspec.get_networks()
148         for network in networks:
149             all_nodes = rspec.get_nodes(network)
150             sliver_nodes = rspec.get_nodes_with_slivers(network)
151             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
152
153             for node in available_nodes:
154                 node_elem = rspec.get_node_element(node, network)
155                 parent = node_elem.xpath("..")[0]
156                 parent.remove(node_elem)
157
158     def getSliceRSpec(self):
159         rspec_file = config.getSliceRSpecFile()
160         if os.path.exists(rspec_file):
161             xml = open(rspec_file).read()
162             rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
163
164             self.purgeNonSliceResources(rspec)
165
166             return rspec
167         return None
168
169     def getResourcesRSpec(self):
170         rspec_file = config.getResourcesRSpecFile()
171         if os.path.exists(rspec_file):
172             xml = open(rspec_file).read()
173             rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
174             return rspec
175         return None
176
177     def getSliverStatus(self, slice=None):
178         if not slice:
179             slice = config.getSlice()
180
181         filename = config.fullpath(slice+".sliverstatus")
182
183         if os.path.exists(filename):
184             data = open(filename).read()
185             return pickle.loads(data)
186
187         return None
188
189     def getSliceMgrVersion(self):
190         filename = config.fullpath("slicemgr.version")
191
192         if os.path.exists(filename):
193             data = open(filename).read()
194             return pickle.loads(data)
195
196         return None
197