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