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