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