extract out the client-slicemgr code from mainscreen
[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 not node:
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             return rec.get_field("slices")
132
133         return []
134
135     def purgeNonSliceResources(self, rspec):
136         # This can probably go away once the new slice manager is fully
137         # deployed.
138         networks = rspec.get_networks()
139         for network in networks:
140             all_nodes = rspec.get_nodes(network)
141             sliver_nodes = rspec.get_nodes_with_slivers(network)
142             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
143
144             for node in available_nodes:
145                 node_elem = rspec.get_node_element(node, network)
146                 parent = node_elem.xpath("..")[0]
147                 parent.remove(node_elem)
148
149     def getSliceRSpec(self):
150         rspec_file = config.getSliceRSpecFile()
151         if os.path.exists(rspec_file):
152             xml = open(rspec_file).read()
153             rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
154
155             self.purgeNonSliceResources(rspec)
156
157             return rspec
158         return None
159
160     def getResourcesRSpec(self):
161         rspec_file = config.getResourcesRSpecFile()
162         if os.path.exists(rspec_file):
163             xml = open(rspec_file).read()
164             rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
165             return rspec
166         return None
167
168     def getSliverStatus(self, slice=None):
169         if not slice:
170             slice = config.getSlice()
171
172         filename = config.fullpath(slice+".sliverstatus")
173
174         if os.path.exists(filename):
175             data = open(filename).read()
176             return pickle.loads(data)
177
178         return None
179
180     def getSliceMgrVersion(self):
181         filename = config.fullpath("slicemgr.version")
182
183         if os.path.exists(filename):
184             data = open(filename).read()
185             return pickle.loads(data)
186
187         return None
188