Added support for new slice table for Senslab.
[sfa.git] / sfa / senslab / OARrspec.py
index bed7fd3..0030342 100644 (file)
@@ -7,14 +7,28 @@ import httplib
 import json
 
 
-from sfa.util.xrn import *
-from sfa.util.plxrn import *
-#from sfa.rspecs.sfa_rspec import SfaRSpec
-from sfa.rspecs.rspec import RSpec
-#from sfa.rspecs.pg_rspec  import PGRSpec
-#from sfa.rspecs.rspec_version import RSpecVersion
 from sfa.rspecs.version_manager import VersionManager
 from sfa.senslab.OARrestapi import *
+from sfa.senslab.slabdriver import SlabDriver
+from sfa.util.config import Config
+from sfa.util.xrn import hrn_to_urn, urn_to_hrn, urn_to_sliver_id
+from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
+
+from sfa.rspecs.rspec import RSpec
+from sfa.rspecs.elements.hardware_type import HardwareType
+from sfa.rspecs.elements.node import Node
+#from sfa.rspecs.elements.link import Link
+#from sfa.rspecs.elements.sliver import Sliver
+#from sfa.rspecs.elements.login import Login
+#from sfa.rspecs.elements.location import Location
+#from sfa.rspecs.elements.interface import Interface
+#from sfa.rspecs.elements.services import Services
+#from sfa.rspecs.elements.pltag import PLTag
+from sfa.util.topology import Topology
+from sfa.rspecs.version_manager import VersionManager
+#from sfa.plc.vlink import get_tc_rate
+from sfa.util.sfatime import epochparse
+
 
 class OARrspec:
 
@@ -29,10 +43,12 @@ class OARrspec:
     prepared=False
     #panos new user options variable
     user_options = {}
-
-    def __init__(self ,api, user_options={}):
+    
+    def __init__(self ,api):
+    #def __init__(self ,api, user_options={}):
        self.OARImporter = OARapi()     
-       self.user_options = user_options
+        self.driver = SlabDriver(Config())
+       #self.user_options = user_options
        self.api = api 
        print >>sys.stderr,"\r\n \r\n \t\t_____________INIT OARRSPEC__ api : %s" %(api)
 
@@ -46,10 +62,10 @@ class OARrspec:
     
     def prepare_nodes(self, force=False):
         if not self.nodes or force:
-            for node in self.OARImporter.GetNodes():
+            for node in self.driver.GetNodes():
+            #for node in self.OARImporter.GetNodes():
                 self.nodes[node['node_id']] = node
-               print >>sys.stderr,'prepare_nodes:node', node
-
+               
     #def prepare_interfaces(self, force=False):
         #if not self.interfaces or force:
             #for interface in self.api.plshell.GetInterfaces(self.api.plauth):
@@ -66,32 +82,119 @@ class OARrspec:
 
     def prepare(self, force=False):
         if not self.prepared or force:
-            self.prepare_sites(force)
+            #self.prepare_sites(force)
             self.prepare_nodes(force)
+            
             #self.prepare_links(force)
             #self.prepare_interfaces(force)
             #self.prepare_node_tags(force)         
             # add site/interface info to nodes
             for node_id in self.nodes:
                 node = self.nodes[node_id]
-                site = self.sites[node['site_id']]
+                #site = self.sites[node['site_id']]
                 #interfaces = [self.interfaces[interface_id] for interface_id in node['interface_ids']]
                 #tags = [self.node_tags[tag_id] for tag_id in node['node_tag_ids']]
-               node['network'] = "senslab"     
+               node['network'] = self.driver.root_auth 
                 node['network_urn'] = hrn_to_urn(node['network'], 'authority+am')
-                node['urn'] = hostname_to_urn(node['network'], site['login_base'], node['hostname'])
-                node['site_urn'] = hrn_to_urn(PlXrn.site_hrn(node['network'], site['login_base']), 'authority+sa') 
-                node['site'] = site
+                #node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname'])
+                node['site_urn'] = hrn_to_urn(PlXrn.site_hrn(node['network'], node['site_login_base']), 'authority+sa') 
+                node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname'])
+                #node['urn'] = PlXrn(auth=node['network']+'.',hostname=node['hostname']).get_urn()
+
+                #node['site'] = site
                 #node['interfaces'] = interfaces
                 #node['tags'] = tags
-               #print >>sys.stderr, "\r\n OAR  prepare ", node 
-               
-        self.prepared = True  
-       
+
+        self.prepared = True 
+        print >>sys.stderr, "\r\n OARrspec  prepare node 10",self.nodes[10]  
+       #print >>sys.stderr, " \r\n \t\t prepare prepare_nodes \r\n %s " %(self.nodes)
+        
+    def get_nodes(self):
+        filtre = {}
+        #tags_filter = {}
+        #if slice and 'node_ids' in slice and slice['node_ids']:
+            #filter['node_id'] = slice['node_ids']
+            #tags_filter=filter.copy()
+        
+        #filter.update({'peer_id': None})
+        nodes = self.driver.GetNodes(filtre)
+        
+        #site_ids = []
+        interface_ids = []
+        tag_ids = []
+        nodes_dict = {}
+        for node in nodes:
+            #site_ids.append(node['site_id'])
+            #interface_ids.extend(node['interface_ids'])
+            #tag_ids.extend(node['node_tag_ids'])
+            nodes_dict[node['node_id']] = node
+    
+        # get sites
+        #sites_dict  = self.get_sites({'site_id': site_ids}) 
+        # get interfaces
+        #interfaces = self.get_interfaces({'interface_id':interface_ids}) 
+        # get tags
+        #node_tags = self.get_node_tags(tags_filter)
+        # get initscripts
+        #pl_initscripts = self.get_pl_initscripts()
+        
+        #links = self.get_links(sites_dict, nodes_dict, interfaces)
+    
+        rspec_nodes = []
+        for node in nodes:
+            # skip whitelisted nodes
+            #if node['slice_ids_whitelist']:
+                #if not slice or slice['slice_id'] not in node['slice_ids_whitelist']:
+                    #continue
+            rspec_node = Node()
+            # xxx how to retrieve site['login_base']
+            #site_id=node['site_id']
+            #site=sites_dict[site_id]
+            rspec_node['component_id'] = hostname_to_urn(self.driver.root_auth, node['site_login_base'], node['hostname'])
+            rspec_node['component_name'] = node['hostname']
+            rspec_node['component_manager_id'] = hrn_to_urn(self.driver.root_auth, 'authority+sa')
+            rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.root_auth, node['site_login_base']), 'authority+sa')
+            rspec_node['boot_state'] = node['boot_state']
+            rspec_node['exclusive'] = 'True'
+            rspec_node['hardware_types']= [HardwareType({'name': 'senslab sensor node'})]
+            # only doing this because protogeni rspec needs
+            # to advertise available initscripts 
+            #rspec_node['pl_initscripts'] = pl_initscripts.values()
+                # add site/interface info to nodes.
+            # assumes that sites, interfaces and tags have already been prepared.
+            #site = sites_dict[node['site_id']]
+            #if site['longitude'] and site['latitude']:  
+                #location = Location({'longitude': site['longitude'], 'latitude': site['latitude']})
+                #rspec_node['location'] = location
+            rspec_node['interfaces'] = []
+            #if_count=0
+            #for if_id in node['interface_ids']:
+                #interface = Interface(interfaces[if_id]) 
+                #interface['ipv4'] = interface['ip']
+                #interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count)).get_urn()
+                #rspec_node['interfaces'].append(interface)
+                #if_count+=1
+    
+            #tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']]
+            rspec_node['tags'] = []
+            #if node['node_id'] in slivers:
+                ## add sliver info
+                #sliver = slivers[node['node_id']]
+                #rspec_node['sliver_id'] = sliver['sliver_id']
+                #rspec_node['client_id'] = node['hostname']
+                #rspec_node['slivers'] = [sliver]
+                
+                ## slivers always provide the ssh service
+                #login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22'})
+                #service = Services({'login': login})
+                #rspec_node['services'] = [service]
+            rspec_nodes.append(rspec_node)
+        return (rspec_nodes)
+        
 #from plc/aggregate.py 
     def get_rspec(self, slice_xrn=None, version = None):
-       print>>sys.stderr, " \r\n OARrspec \t\t get_spec **************\r\n" 
-        self.prepare()
+       print>>sys.stderr, " \r\n OARrspec \t\t get_rspec **************\r\n" 
+        #self.prepare()
        
         rspec = None
        version_manager = VersionManager()
@@ -105,33 +208,11 @@ class OARrspec:
             rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
       
         rspec = RSpec(version=rspec_version, user_options=self.user_options)
-        rspec.version.add_nodes(self.nodes.values())
-       print >>sys.stderr, 'after add_nodes'
+        
+        nodes = self.get_nodes()
+        rspec.version.add_nodes(nodes)
+      
+       print >>sys.stderr, 'after add_nodes '
       
 
-        #rspec.add_links(self.links.values())
-
-        #if slice_xrn:
-            ## get slice details
-            #slice_hrn, _ = urn_to_hrn(slice_xrn)
-            #slice_name = hrn_to_pl_slicename(slice_hrn)
-            #slices = self.api.plshell.GetSlices(self.api.plauth, slice_name)
-            #if slices:
-                #slice = slices[0]
-                #slivers = []
-                #tags = self.api.plshell.GetSliceTags(self.api.plauth, slice['slice_tag_ids'])
-                #for node_id in slice['node_ids']:
-                    #sliver = {}
-                    #sliver['hostname'] = self.nodes[node_id]['hostname']
-                    #sliver['tags'] = []
-                    #slivers.append(sliver)
-                    #for tag in tags:
-                        ## if tag isn't bound to a node then it applies to all slivers
-                        #if not tag['node_id']:
-                            #sliver['tags'].append(tag)
-                        #else:
-                            #tag_host = self.nodes[tag['node_id']]['hostname']
-                            #if tag_host == sliver['hostname']:
-                                #sliver.tags.append(tag)
-                #rspec.add_slivers(slivers)
         return rspec.toxml()