Update in import packages.
[sfa.git] / sfa / senslab / slabaggregate.py
index 0dd9298..5b1eeed 100644 (file)
@@ -1,6 +1,3 @@
-
-#!/usr/bin/python
-
 # import modules used here -- sys is a very standard one
 import sys
 import httplib
@@ -8,34 +5,29 @@ import json
 
 
 
-from sfa.senslab.OARrestapi import *
-#from sfa.senslab.slabdriver import SlabDriver
+#from sfa.senslab.OARrestapi import *
+
 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.planetlab.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename
 
 from sfa.rspecs.rspec import RSpec
 from sfa.rspecs.elements.location import Location
 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.rspecs.elements.sliver import Sliver
 
 from sfa.rspecs.version_manager import VersionManager
-#from sfa.plc.vlink import get_tc_rate
+
 from sfa.util.sfatime import datetime_to_epoch
 
 def hostname_to_hrn(root_auth,login_base,hostname):
-    return PlXrn(auth=root_auth,hostname=login_base+'_'+hostname).get_hrn()
+    return PlXrn(auth=root_auth,hostname=login_base + '_'+hostname).get_hrn()
 
 class SlabAggregate:
 
-    
     sites = {}
     nodes = {}
     api = None
@@ -48,11 +40,7 @@ class SlabAggregate:
     user_options = {}
     
     def __init__(self ,driver):
-       #self.OARImporter = OARapi()    
         self.driver = driver
-       #self.api = api 
-       print >>sys.stderr,"\r\n \r\n \t\t_____________INIT Slabaggregate api : %s" %(driver)
-
 
     def get_slice_and_slivers(self, slice_xrn):
         """
@@ -66,7 +54,7 @@ class SlabAggregate:
         slice_hrn, _ = urn_to_hrn(slice_xrn)
         slice_name = slice_hrn
         print >>sys.stderr,"\r\n \r\n \t\t_____________ Slabaggregate api get_slice_and_slivers "
-        slices = self.driver.GetSlices(slice_filter= str(slice_name), filter_type = 'slice_hrn')
+        slices = self.driver.GetSlices(slice_filter= str(slice_name), slice_filter_type = 'slice_hrn')
         print >>sys.stderr,"\r\n \r\n \t\t_____________ Slabaggregate api get_slice_and_slivers  slices %s " %(slices)
         if not slices:
             return (slice, slivers)
@@ -84,7 +72,7 @@ class SlabAggregate:
                     #node_id = self.driver.root_auth + '.' + node_id
                     sliver = Sliver({'sliver_id': urn_to_sliver_id(slice_urn, slice['record_id_slice'], node_id),
                                     'name': slice['slice_hrn'],
-                                    'type': 'slab-vm', 
+                                    'type': 'slab-node', 
                                     'tags': []})
                     slivers[node_id]= sliver
             except KeyError:
@@ -102,47 +90,9 @@ class SlabAggregate:
         print >>sys.stderr,"\r\n \r\n \t\t_____________ Slabaggregate api get_slice_and_slivers  slivers %s " %(slivers)
         return (slice, slivers)
             
-            
-  
-    def get_nodes(self,slice=None,slivers=[], options={}):
-        filtre = {}
-        
-        nodes = self.driver.GetNodes(filtre)
-        
-        
-        interface_ids = []
-        tag_ids = []
-        nodes_dict = {}
-        for node in nodes:
-            nodes_dict[node['node_id']] = node
-
-        rspec_nodes = []
-        for node in nodes:
-          
-            node['hostname'] = hostname_to_hrn( self.driver.root_auth,node['site_login_base'], node['hostname'])
-            rspec_node = Node()
-                      
-            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']
-            if node['posx'] and node['posy']:  
-                location = Location({'longitude':node['posx'], 'latitude': node['posy']})
-                rspec_node['location'] = location
-    
-            rspec_node['exclusive'] = 'True'
-            rspec_node['hardware_types']= [HardwareType({'name': 'senslab sensor node'})]
-
-            rspec_node['interfaces'] = []
-          
 
-            rspec_node['tags'] = []
-           
-            rspec_nodes.append(rspec_node)
-        return (rspec_nodes)
         
-    def get_nodes_and_links(self, slice=None,slivers=[], options={}):
+    def get_nodes(self, slice=None,slivers=[], options={}):
         # NT: the semantic of this function is not clear to me :
         # if slice is not defined, then all the nodes should be returned
         # if slice is defined, we should return only the nodes that are part of this slice
@@ -151,26 +101,26 @@ class SlabAggregate:
         filter = {}
         tags_filter = {}
         
-        if slice :
-            if 'node_ids' in slice and slice['node_ids']:
-                #first case, a non empty slice was provided
-                filter['hostname'] = slice['node_ids']
-                tags_filter=filter.copy()
-                nodes = self.driver.GetNodes(filter['hostname'])
-            else :
-                #second case, a slice was provided, but is empty
-                nodes={}
-        else :
-            #third case, no slice was provided
-            nodes = self.driver.GetNodes()
-            
+        # Commenting this part since all nodes should be returned, even if a slice is provided
+        #if slice :
+        #    if 'node_ids' in slice and slice['node_ids']:
+        #        #first case, a non empty slice was provided
+        #        filter['hostname'] = slice['node_ids']
+        #        tags_filter=filter.copy()
+        #        nodes = self.driver.GetNodes(filter['hostname'])
+        #    else :
+        #        #second case, a slice was provided, but is empty
+        #        nodes={}
+        #else :
+        #    #third case, no slice was provided
+        #    nodes = self.driver.GetNodes()
+        nodes = self.driver.GetNodes()
         #geni_available = options.get('geni_available')    
         #if geni_available:
             #filter['boot_state'] = 'boot'     
-        print>>sys.stderr, "\r\n \r\n \t get_nodes_and_links filter %s \r\n \r\n \t slivers %s nodes[0] %s " %(filter, slivers,nodes[0])
+       
         #filter.update({'peer_id': None})
         #nodes = self.driver.GetNodes(filter['hostname'])
-        #print>>sys.stderr, "\r\n \r\n \t get_nodes_and_links nodes %s" %(nodes)
         
         #site_ids = []
         #interface_ids = []
@@ -189,8 +139,8 @@ class SlabAggregate:
         # get tags
         #node_tags = self.get_node_tags(tags_filter)
        
-        #links = self.get_links(sites_dict, nodes_dict, interfaces)
-        
+
+        reserved_nodes=self.driver.GetReservedNodes()
         rspec_nodes = []
         for node in nodes:
             # skip whitelisted nodes
@@ -207,10 +157,17 @@ class SlabAggregate:
             #rspec_node['component_manager_id'] = Xrn(self.driver.root_auth, 'authority+sa').get_urn()
             rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.root_auth, node['site']), 'authority+sa')
             # do not include boot state (<available> element) in the manifest rspec
-            if not slice:     
-                rspec_node['boot_state'] = node['boot_state']
+            
+            #if not slice:
+            #    rspec_node['boot_state'] = node['boot_state']
+            #    if node['hostname'] in reserved_nodes:
+            #        rspec_node['boot_state'] = "Reserved"
+            rspec_node['boot_state'] = node['boot_state']
+            if node['hostname'] in reserved_nodes:
+                rspec_node['boot_state'] = "Reserved"
             rspec_node['exclusive'] = 'True'
             rspec_node['hardware_types'] = [HardwareType({'name': 'slab-node'})]
+
             # only doing this because protogeni rspec needs
             # to advertise available initscripts 
             #rspec_node['pl_initscripts'] = None
@@ -218,9 +175,12 @@ class SlabAggregate:
             # assumes that sites, interfaces and tags have already been prepared.
             #site = sites_dict[node['site_id']]
          
-            if node['posx'] and node['posy']:  
-                location = Location({'longitude':node['posx'], 'latitude': node['posy']})
-                rspec_node['location'] = location
+            try:
+                if node['posx'] and node['posy']:  
+                    location = Location({'longitude':node['posx'], 'latitude': node['posy']})
+                    rspec_node['location'] = location
+            except KeyError:
+                    pass
             #rspec_node['interfaces'] = []
             #if_count=0
             #for if_id in node['interface_ids']:
@@ -236,9 +196,9 @@ class SlabAggregate:
         
             #tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']]
             rspec_node['tags'] = []
-            if node['hrn'] in slivers:
+            if node['hostname'] in slivers:
                 # add sliver info
-                sliver = slivers[node['node_id']]
+                sliver = slivers[node['hostname']]
                 rspec_node['sliver_id'] = sliver['sliver_id']
                 rspec_node['client_id'] = node['hostname']
                 rspec_node['slivers'] = [sliver]
@@ -248,7 +208,7 @@ class SlabAggregate:
                 #service = Services({'login': login})
                 #rspec_node['services'] = [service]
             rspec_nodes.append(rspec_node)
-        print>>sys.stderr, "\r\n \r\n \t get_nodes_and_links options %s rspec_nodes[0] %s " %(options,rspec_nodes[0])
+        
         return (rspec_nodes)       
 
 #from plc/aggregate.py 
@@ -274,12 +234,12 @@ class SlabAggregate:
         #if slice and 'expires' in slice:
            #rspec.xml.set('expires',  datetime_to_epoch(slice['expires']))
          # add sliver defaults
-        #nodes, links = self.get_nodes_and_links(slice, slivers)
-        nodes = self.get_nodes_and_links(slice,slivers) 
+        #nodes, links = self.get_nodes(slice, slivers)
+        nodes = self.get_nodes(slice,slivers) 
         print>>sys.stderr, " \r\n SlabAggregate \t\t get_rspec ************** options %s rspec_version %s version_manager %s  rspec.version %s \r\n" %(options, rspec_version,version_manager, rspec.version)
         rspec.version.add_nodes(nodes)
 
-        #rspec.version.add_links(links)
+
         default_sliver = slivers.get(None, [])
         if default_sliver:
             default_sliver_attribs = default_sliver.get('tags', [])