003034233329434734fec71762c15e30232cacb1
[sfa.git] / sfa / senslab / OARrspec.py
1
2 #!/usr/bin/python
3
4 # import modules used here -- sys is a very standard one
5 import sys
6 import httplib
7 import json
8
9
10 from sfa.rspecs.version_manager import VersionManager
11 from sfa.senslab.OARrestapi import *
12 from sfa.senslab.slabdriver import SlabDriver
13 from sfa.util.config import Config
14 from sfa.util.xrn import hrn_to_urn, urn_to_hrn, urn_to_sliver_id
15 from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
16
17 from sfa.rspecs.rspec import RSpec
18 from sfa.rspecs.elements.hardware_type import HardwareType
19 from sfa.rspecs.elements.node import Node
20 #from sfa.rspecs.elements.link import Link
21 #from sfa.rspecs.elements.sliver import Sliver
22 #from sfa.rspecs.elements.login import Login
23 #from sfa.rspecs.elements.location import Location
24 #from sfa.rspecs.elements.interface import Interface
25 #from sfa.rspecs.elements.services import Services
26 #from sfa.rspecs.elements.pltag import PLTag
27 from sfa.util.topology import Topology
28 from sfa.rspecs.version_manager import VersionManager
29 #from sfa.plc.vlink import get_tc_rate
30 from sfa.util.sfatime import epochparse
31
32
33 class OARrspec:
34
35     
36     sites = {}
37     nodes = {}
38     api = None
39     interfaces = {}
40     links = {}
41     node_tags = {}
42     
43     prepared=False
44     #panos new user options variable
45     user_options = {}
46     
47     def __init__(self ,api):
48     #def __init__(self ,api, user_options={}):
49         self.OARImporter = OARapi()     
50         self.driver = SlabDriver(Config())
51         #self.user_options = user_options
52         self.api = api 
53         print >>sys.stderr,"\r\n \r\n \t\t_____________INIT OARRSPEC__ api : %s" %(api)
54
55     def prepare_sites(self, force=False):
56         print >>sys.stderr,'\r\n \r\n ++++++++++++++\t\t prepare_sites'
57         if not self.sites or force:  
58              for site in self.OARImporter.GetSites():
59                 print >>sys.stderr,'prepare_sites : site ', site                    
60                 self.sites[site['site_id']] = site
61         
62     
63     def prepare_nodes(self, force=False):
64         if not self.nodes or force:
65             for node in self.driver.GetNodes():
66             #for node in self.OARImporter.GetNodes():
67                 self.nodes[node['node_id']] = node
68                 
69     #def prepare_interfaces(self, force=False):
70         #if not self.interfaces or force:
71             #for interface in self.api.plshell.GetInterfaces(self.api.plauth):
72                 #self.interfaces[interface['interface_id']] = interface
73
74     #def prepare_node_tags(self, force=False):
75         #if not self.node_tags or force:
76             #for node_tag in self.api.plshell.GetNodeTags(self.api.plauth):
77                 #self.node_tags[node_tag['node_tag_id']] = node_tag
78                 
79     def prepare_links(self, force=False):
80         if not self.links or force:
81             pass
82
83     def prepare(self, force=False):
84         if not self.prepared or force:
85             #self.prepare_sites(force)
86             self.prepare_nodes(force)
87             
88             #self.prepare_links(force)
89             #self.prepare_interfaces(force)
90             #self.prepare_node_tags(force)          
91             # add site/interface info to nodes
92             for node_id in self.nodes:
93                 node = self.nodes[node_id]
94                 #site = self.sites[node['site_id']]
95                 #interfaces = [self.interfaces[interface_id] for interface_id in node['interface_ids']]
96                 #tags = [self.node_tags[tag_id] for tag_id in node['node_tag_ids']]
97                 node['network'] = self.driver.root_auth 
98                 node['network_urn'] = hrn_to_urn(node['network'], 'authority+am')
99                 #node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname'])
100                 node['site_urn'] = hrn_to_urn(PlXrn.site_hrn(node['network'], node['site_login_base']), 'authority+sa') 
101                 node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname'])
102                 #node['urn'] = PlXrn(auth=node['network']+'.',hostname=node['hostname']).get_urn()
103
104                 #node['site'] = site
105                 #node['interfaces'] = interfaces
106                 #node['tags'] = tags
107
108         self.prepared = True 
109         print >>sys.stderr, "\r\n OARrspec  prepare node 10",self.nodes[10]  
110         #print >>sys.stderr, " \r\n \t\t prepare prepare_nodes \r\n %s " %(self.nodes)
111         
112     def get_nodes(self):
113         filtre = {}
114         #tags_filter = {}
115         #if slice and 'node_ids' in slice and slice['node_ids']:
116             #filter['node_id'] = slice['node_ids']
117             #tags_filter=filter.copy()
118         
119         #filter.update({'peer_id': None})
120         nodes = self.driver.GetNodes(filtre)
121         
122         #site_ids = []
123         interface_ids = []
124         tag_ids = []
125         nodes_dict = {}
126         for node in nodes:
127             #site_ids.append(node['site_id'])
128             #interface_ids.extend(node['interface_ids'])
129             #tag_ids.extend(node['node_tag_ids'])
130             nodes_dict[node['node_id']] = node
131     
132         # get sites
133         #sites_dict  = self.get_sites({'site_id': site_ids}) 
134         # get interfaces
135         #interfaces = self.get_interfaces({'interface_id':interface_ids}) 
136         # get tags
137         #node_tags = self.get_node_tags(tags_filter)
138         # get initscripts
139         #pl_initscripts = self.get_pl_initscripts()
140         
141         #links = self.get_links(sites_dict, nodes_dict, interfaces)
142     
143         rspec_nodes = []
144         for node in nodes:
145             # skip whitelisted nodes
146             #if node['slice_ids_whitelist']:
147                 #if not slice or slice['slice_id'] not in node['slice_ids_whitelist']:
148                     #continue
149             rspec_node = Node()
150             # xxx how to retrieve site['login_base']
151             #site_id=node['site_id']
152             #site=sites_dict[site_id]
153             rspec_node['component_id'] = hostname_to_urn(self.driver.root_auth, node['site_login_base'], node['hostname'])
154             rspec_node['component_name'] = node['hostname']
155             rspec_node['component_manager_id'] = hrn_to_urn(self.driver.root_auth, 'authority+sa')
156             rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.root_auth, node['site_login_base']), 'authority+sa')
157             rspec_node['boot_state'] = node['boot_state']
158             rspec_node['exclusive'] = 'True'
159             rspec_node['hardware_types']= [HardwareType({'name': 'senslab sensor node'})]
160             # only doing this because protogeni rspec needs
161             # to advertise available initscripts 
162             #rspec_node['pl_initscripts'] = pl_initscripts.values()
163                 # add site/interface info to nodes.
164             # assumes that sites, interfaces and tags have already been prepared.
165             #site = sites_dict[node['site_id']]
166             #if site['longitude'] and site['latitude']:  
167                 #location = Location({'longitude': site['longitude'], 'latitude': site['latitude']})
168                 #rspec_node['location'] = location
169             rspec_node['interfaces'] = []
170             #if_count=0
171             #for if_id in node['interface_ids']:
172                 #interface = Interface(interfaces[if_id]) 
173                 #interface['ipv4'] = interface['ip']
174                 #interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count)).get_urn()
175                 #rspec_node['interfaces'].append(interface)
176                 #if_count+=1
177     
178             #tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']]
179             rspec_node['tags'] = []
180             #if node['node_id'] in slivers:
181                 ## add sliver info
182                 #sliver = slivers[node['node_id']]
183                 #rspec_node['sliver_id'] = sliver['sliver_id']
184                 #rspec_node['client_id'] = node['hostname']
185                 #rspec_node['slivers'] = [sliver]
186                 
187                 ## slivers always provide the ssh service
188                 #login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22'})
189                 #service = Services({'login': login})
190                 #rspec_node['services'] = [service]
191             rspec_nodes.append(rspec_node)
192         return (rspec_nodes)
193         
194 #from plc/aggregate.py 
195     def get_rspec(self, slice_xrn=None, version = None):
196         print>>sys.stderr, " \r\n OARrspec \t\t get_rspec **************\r\n" 
197         #self.prepare()
198         
199         rspec = None
200         version_manager = VersionManager()
201         version = version_manager.get_version(version)
202         #rspec_version = RSpecVersion(version)
203         #print >>sys.stderr, '\r\n \t\t rspec_version type',version_manager['type']
204         
205         if not slice_xrn:
206             rspec_version = version_manager._get_version(version.type, version.version, 'ad')
207         else:
208             rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
209       
210         rspec = RSpec(version=rspec_version, user_options=self.user_options)
211         
212         nodes = self.get_nodes()
213         rspec.version.add_nodes(nodes)
214       
215         print >>sys.stderr, 'after add_nodes '
216       
217
218         return rspec.toxml()