attribute stuff working
[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 merge_node(self, source_node_tag, network, no_dupes=False):
54         return self.version.merge_node(source_node_tag, network, no_dupes)
55
56     def get_node_sliver_type(self, node, network):
57         node = self.get_node_element(node, network)
58         if node is None:
59             return ""
60
61         sliver_types = node.xpath("sliver_type")
62         if len(sliver_types)>0:
63             return sliver_types[0].attrib.get("name", "")
64
65         return ""
66
67 class SfiData:
68     def __init__(self):
69         pass
70
71     def getAuthorityHrns(self, type=None):
72         names = []
73         if os.path.exists(config.getAuthorityListFile()):
74             xml = open(config.getAuthorityListFile()).read()
75             tree = etree.fromstring(xml)
76             records = tree.xpath("//recordlist/record")
77
78             for record in records:
79                 recType = record.attrib.get("type", None)
80                 recHrn = record.attrib.get("hrn", None)
81                 if (type==None) or (type==recType):
82                     names.append(recHrn)
83
84         return names
85
86     def getSliceRecord(self):
87         rec_file = config.getSliceRecordFile()
88         if os.path.exists(rec_file):
89             xml = open(rec_file).read()
90             rec = SliceRecord()
91             rec.load_from_string(xml)
92             return rec
93         return None
94
95     def getUserRecord(self):
96         rec_file = config.getUserRecordFile()
97         if os.path.exists(rec_file):
98             xml = open(rec_file).read()
99             rec = UserRecord()
100             rec.load_from_string(xml)
101             return rec
102         return None
103
104     def getUserSliceHrns(self):
105         rec = self.getUserRecord()
106         if rec:
107             slices = rec.get_field("slices")
108             if (type(slices)!=list) or (len(slices)<1):
109                 return []
110
111             # get_field("slices") is returning [{"text": name}, {"text": name}, ...]
112             if (type(slices[0])==dict):
113                 if "text" in slices[0]:
114                     slices = [x["text"] for x in slices]
115
116             return 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