57a6260eaabede71b8eceb16288f7f935b4a2255
[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_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
42     #    return self.version.add_slivers(slivers, network, sliver_urn, no_dupes)
43
44     def merge_node(self, source_node_tag, network, no_dupes=False):
45         return self.version.merge_node(source_node_tag, network, no_dupes)
46
47     # sfav1.add_slivers isn't working for us...
48     def add_slivers(self, slivers, network=None, sliver_urn=None, no_dupes=False):
49         # add slice name to network tag
50         network_tags = self.xml.xpath('//network')
51         if network_tags:
52             network_tag = network_tags[0]
53             network_tag.set('slice', urn_to_hrn(sliver_urn)[0])
54
55         # add slivers
56         for sliver in slivers:
57             node_elem = self.get_node_element(sliver['hostname'], network)
58             if not node_elem: continue
59             sliver_elem = etree.SubElement(node_elem, 'sliver')
60             if 'tags' in sliver:
61                 for tag in sliver['tags']:
62                     etree.SubElement(sliver_elem, tag['tagname']).text = value=tag['value']
63
64 class SfiData:
65     def __init__(self):
66         pass
67
68     def getAuthorityHrns(self, type=None):
69         names = []
70         if os.path.exists(config.getAuthorityListFile()):
71             xml = open(config.getAuthorityListFile()).read()
72             tree = etree.fromstring(xml)
73             records = tree.xpath("//recordlist/record")
74
75             for record in records:
76                 recType = record.attrib.get("type", None)
77                 recHrn = record.attrib.get("hrn", None)
78                 if (type==None) or (type==recType):
79                     names.append(recHrn)
80
81         return names
82
83     def getSliceRecord(self):
84         rec_file = config.getSliceRecordFile()
85         if os.path.exists(rec_file):
86             xml = open(rec_file).read()
87             rec = SliceRecord()
88             rec.load_from_string(xml)
89             return rec
90         return None
91
92     def getUserRecord(self):
93         rec_file = config.getUserRecordFile()
94         if os.path.exists(rec_file):
95             xml = open(rec_file).read()
96             rec = UserRecord()
97             rec.load_from_string(xml)
98             return rec
99         return None
100
101     def getUserSliceHrns(self):
102         rec = self.getUserRecord()
103         if rec:
104             return rec.get_field("slices")
105
106         return []
107
108     def purgeNonSliceResources(self, rspec):
109         # This can probably go away once the new slice manager is fully
110         # deployed.
111         networks = rspec.get_networks()
112         for network in networks:
113             all_nodes = rspec.get_nodes(network)
114             sliver_nodes = rspec.get_nodes_with_slivers(network)
115             available_nodes = [ node for node in all_nodes if node not in sliver_nodes ]
116
117             for node in available_nodes:
118                 node_elem = rspec.get_node_element(node, network)
119                 parent = node_elem.xpath("..")[0]
120                 parent.remove(node_elem)
121
122     def getSliceRSpec(self):
123         rspec_file = config.getSliceRSpecFile()
124         if os.path.exists(rspec_file):
125             xml = open(rspec_file).read()
126             rspec = SfaceRSpec(rspec=xml) #rspec = parse_rspec(xml)
127
128             self.purgeNonSliceResources(rspec)
129
130             return rspec
131         return None
132
133     def getResourcesRSpec(self):
134         rspec_file = config.getResourcesRSpecFile()
135         if os.path.exists(rspec_file):
136             xml = open(rspec_file).read()
137             rspec = SfaceRSpec(rspec=xml) #rspec= parse_rspec(xml)
138             return rspec
139         return None
140
141     def getSliverStatus(self, slice=None):
142         if not slice:
143             slice = config.getSlice()
144
145         filename = config.fullpath(slice+".sliverstatus")
146
147         if os.path.exists(filename):
148             data = open(filename).read()
149             return pickle.loads(data)
150
151         return None
152
153     def getSliceMgrVersion(self):
154         filename = config.fullpath("slicemgr.version")
155
156         if os.path.exists(filename):
157             data = open(filename).read()
158             return pickle.loads(data)
159
160         return None
161