Added Slabv1 specific RSpec support.
authorSandrine Avakian <sandrine.avakian@inria.fr>
Wed, 25 Apr 2012 15:27:39 +0000 (17:27 +0200)
committerSandrine Avakian <sandrine.avakian@inria.fr>
Wed, 25 Apr 2012 15:27:39 +0000 (17:27 +0200)
Added special Timeslot element files.
Timeslot supports specification of different timezones
when creating a new experiment using senslab Rspec, computed
in AddSliceToNodes.
Timeslot format used :
<timeslot time="2012-04-26 10:00:00 Canada/Central" duration = "00:18:45" />
Timeslot does not belong to Node element, nor Sliver element.
Specific xml header should be used in order to trigger Slabv1 rspec
parsing functions.
<?xml version="1.0"?>
<rspec type="request" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://senslab.info/resources/rspec/1" xmlns:flack="http://senslab.info/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://senslab.info/resources/rspec/1 http://senslab.info/resources/rspec/1/request.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd" expires="2012-04-20T09:43:07Z" generated="2012-04-20T08:43:07Z">

sfa/rspecs/elements/timeslot.py [new file with mode: 0644]
sfa/rspecs/elements/versions/slabv1Node.py
sfa/rspecs/elements/versions/slabv1Sliver.py
sfa/rspecs/elements/versions/slabv1Timeslot.py [new file with mode: 0644]
sfa/rspecs/versions/slabv1.py
sfa/senslab/OARrestapi.py
sfa/senslab/parsing.py
sfa/senslab/slabaggregate.py
sfa/senslab/slabdriver.py
sfa/senslab/slabslices.py

diff --git a/sfa/rspecs/elements/timeslot.py b/sfa/rspecs/elements/timeslot.py
new file mode 100644 (file)
index 0000000..6c7e4e4
--- /dev/null
@@ -0,0 +1,15 @@
+###########################################################################
+#    Copyright (C) 2012 by                                       
+#    <savakian@sfa2.grenoble.senslab.info>                                                             
+#
+# Copyright: See COPYING file that comes with this distribution
+#
+###########################################################################
+from sfa.rspecs.elements.element import Element
+
+class Timeslot(Element):
+    
+    fields = [
+        'time',
+        'duration'
+    ]        
index a4eb650..2baedc5 100644 (file)
@@ -31,7 +31,8 @@ class Slabv1Node:
                     node_elem.add_instance('hardware_type', hardware_type, HardwareType.fields)
             # set location
             if node.get('location'):
-                node_elem.add_instance('location', node['location'], Location.fields)       
+                node_elem.add_instance('location', node['location'], Location.fields)
+
             # set interfaces
             #if node.get('interfaces'):
                 #for interface in  node.get('interfaces', []):
@@ -55,20 +56,23 @@ class Slabv1Node:
                 if node.get('pl_initscripts'): 
                     for initscript in node.get('pl_initscripts', []):
                         slivers['tags'].append({'name': 'initscript', 'value': initscript['name']})
-        Slabv1Sliver.add_slivers(node_elem, slivers)
-        print>>sys.stderr, "\r\n \r\n SLABV1NODE.PY \t\t addnodes node_elems[0] %s" %(node_elems[0])
+           
+            Slabv1Sliver.add_slivers(node_elem, slivers)
         return node_elems
 
     @staticmethod
     def get_nodes(xml, filter={}):
         xpath = '//node%s | //default:node%s' % (XpathFilter.xpath(filter), XpathFilter.xpath(filter))
-        node_elems = xml.xpath(xpath)
+        node_elems = xml.xpath(xpath)  
+        print>>sys.stderr, "\r\n \r\n \t\t \t SLABV1NODE.pY    get_nodes!!!!!!!!!   node_elems %s"%(node_elems)
         return Slabv1Node.get_node_objs(node_elems)
 
-    @staticmethod
+    @staticmethod 
     def get_nodes_with_slivers(xml, filter={}):
-        xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]' 
-        node_elems = xml.xpath(xpath)        
+        #xpath = '//node[count(sliver_type)>0] | //default:node[count(default:sliver_type) > 0]' 
+        xpath = '//node[count(sliver)>0] | //default:node[count(default:sliver) > 0]' 
+        node_elems = xml.xpath(xpath)    
+        print>>sys.stderr, "\r\n \r\n \t\t \t SLABV1NODE.pY    get_nodes_with_slivers  node_elems %s"%(node_elems)
         return Slabv1Node.get_node_objs(node_elems)
 
     @staticmethod
@@ -96,7 +100,7 @@ class Slabv1Node:
 
             # get services
             #node['services'] = PGv2Services.get_services(node_elem)
-            
+
             # get slivers
             node['slivers'] = Slabv1Sliver.get_slivers(node_elem)    
             available_elems = node_elem.xpath('./default:available | ./available')
@@ -110,6 +114,7 @@ class Slabv1Node:
 
     @staticmethod
     def add_slivers(xml, slivers):
+        print>>sys.stderr, "\r\n \r\n \t\t SLABv1NODE.PY add_slivers "
         component_ids = []
         for sliver in slivers:
             filter = {}
index a4c9be4..370f55f 100644 (file)
@@ -1,7 +1,8 @@
 from sfa.rspecs.elements.element import Element
 from sfa.rspecs.elements.sliver import Sliver
-#from sfa.rspecs.elements.versions.pgv2DiskImage import PGv2DiskImage
 
+#from sfa.rspecs.elements.versions.pgv2DiskImage import PGv2DiskImage
+import sys
 class Slabv1Sliver:
 
     @staticmethod
@@ -11,7 +12,8 @@ class Slabv1Sliver:
         if not isinstance(slivers, list):
             slivers = [slivers]
         for sliver in slivers: 
-            sliver_elem = xml.add_element('sliver_type')
+            #sliver_elem = xml.add_element('sliver_type')
+            sliver_elem = xml.add_element('sliver')
             if sliver.get('type'):
                 sliver_elem.set('name', sliver['type'])
             if sliver.get('client_id'):
@@ -34,16 +36,20 @@ class Slabv1Sliver:
                         attrib_elem.set(key, value)                
     @staticmethod
     def get_slivers(xml, filter={}):
-        xpath = './default:sliver_type | ./sliver_type'
+        xpath = './default:sliver | ./sliver'
+     
         sliver_elems = xml.xpath(xpath)
         slivers = []
-        for sliver_elem in sliver_elems:
+        for sliver_elem in sliver_elems: 
             sliver = Sliver(sliver_elem.attrib,sliver_elem)
+
             if 'component_id' in xml.attrib:     
                 sliver['component_id'] = xml.attrib['component_id']
             if 'name' in sliver_elem.attrib:
                 sliver['type'] = sliver_elem.attrib['name']
             #sliver['images'] = Slabv1DiskImage.get_images(sliver_elem)
+                
+            print>>sys.stderr, "\r\n \r\n SLABV1SLIVER.PY  \t\t\t  get_slivers sliver %s " %( sliver)
             slivers.append(sliver)
         return slivers
 
diff --git a/sfa/rspecs/elements/versions/slabv1Timeslot.py b/sfa/rspecs/elements/versions/slabv1Timeslot.py
new file mode 100644 (file)
index 0000000..a74c729
--- /dev/null
@@ -0,0 +1,16 @@
+from sfa.rspecs.elements.element import Element
+from sfa.rspecs.elements.timeslot import Timeslot
+import sys
+
+class Slabv1Timeslot :
+    @staticmethod 
+    def get_slice_timeslot(xml, filter={}):
+        print>>sys.stderr, "\r\n \r\n \t\t \t SLABV1TIMESLOT.pY >>>>>>>>>>>>>>>>>>>>>>>>>>>>> \t  get_slice_timeslot  "
+        xpath = '//default:timeslot | //timeslot' 
+        timeslot_elems = xml.xpath(xpath)  
+        print>>sys.stderr, "\r\n \r\n \t\t \t SLABV1TIMESLOT.pY >>>>>>>>>>>>>>>>>>>>>>>>>>>>> \t  get_slice_timeslot    timeslot_elems %s"%(timeslot_elems)
+        for timeslot_elem in timeslot_elems:  
+            timeslot = Timeslot(timeslot_elem.attrib, timeslot_elem) 
+            print>>sys.stderr, "\r\n \r\n \t\t \t SLABV1TIMESLOT.pY >>>>>>>>>>>>>>>>>>>>>>>>>>>>> \t  get_slice_timeslot   timeslot  %s"%(timeslot)
+
+        return timeslot
\ No newline at end of file
index 8c1030c..ddcd116 100644 (file)
@@ -3,9 +3,10 @@ from StringIO import StringIO
 from sfa.util.xrn import Xrn, urn_to_sliver_id
 from sfa.util.plxrn import hostname_to_urn, xrn_to_hostname 
 from sfa.rspecs.baseversion import BaseVersion
-
+import sys
 from sfa.rspecs.elements.versions.slabv1Node import Slabv1Node
 from sfa.rspecs.elements.versions.slabv1Sliver import Slabv1Sliver
+from sfa.rspecs.elements.versions.slabv1Timeslot import Slabv1Timeslot
  
 class Slabv1(BaseVersion):
     #enabled = True
@@ -47,6 +48,9 @@ class Slabv1(BaseVersion):
 
     def get_nodes_with_slivers(self):
         return Slabv1Node.get_nodes_with_slivers(self.xml)
+    
+    def get_slice_timeslot(self ):
+        return Slabv1Timeslot.get_slice_timeslot(self.xml)
 
     def add_nodes(self, nodes, check_for_dupes=False):
         return Slabv1Node.add_nodes(self.xml, nodes)
@@ -60,40 +64,56 @@ class Slabv1(BaseVersion):
 
     # Slivers
     
-    def get_sliver_attributes(self, hostname, network=None):
+    def get_sliver_attributes(self, hostname, node, network=None): 
+        print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY  get_sliver_attributes hostname %s " %(hostname)
         nodes = self.get_nodes({'component_id': '*%s*' %hostname})
-        attribs = []
+        attribs = [] 
+        print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY  get_sliver_attributes-----------------nodes %s  " %(nodes)
         if nodes is not None and isinstance(nodes, list) and len(nodes) > 0:
             node = nodes[0]
-            sliver = node.xpath('./default:sliver_type', namespaces=self.namespaces)
+        #if node : 
+            #sliver = node.xpath('./default:sliver | ./sliver')
+            #sliver = node.xpath('./default:sliver', namespaces=self.namespaces)
+            sliver = node['slivers']
+            
             if sliver is not None and isinstance(sliver, list) and len(sliver) > 0:
                 sliver = sliver[0]
+                attribs = sliver
                 #attribs = self.attributes_list(sliver)
+                print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY  get_sliver_attributes----------NN------- sliver %s self.namespaces %s attribs %s " %(sliver, self.namespaces,attribs)
         return attribs
 
     def get_slice_attributes(self, network=None):
+        
         slice_attributes = []
+        slot = self.get_slice_timeslot()
         nodes_with_slivers = self.get_nodes_with_slivers()
+        slice_attributes.append({'timeslot':slot})
+        #slice_attributes.append({'name': 'timeslot', 'value' : slot})
+        print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_slice_attributes -----------------nodes_with_slivers %s "%(nodes_with_slivers)
         # TODO: default sliver attributes in the PG rspec?
         default_ns_prefix = self.namespaces['default']
         for node in nodes_with_slivers:
-            sliver_attributes = self.get_sliver_attributes(node, network)
+            sliver_attributes = self.get_sliver_attributes(node['component_id'],node, network)
             for sliver_attribute in sliver_attributes:
                 name=str(sliver_attribute[0])
                 text =str(sliver_attribute[1])
                 attribs = sliver_attribute[2]
                 # we currently only suppor the <initscript> and <flack> attributes
-                if  'info' in name:
-                    attribute = {'name': 'flack_info', 'value': str(attribs), 'node_id': node}
-                    slice_attributes.append(attribute)
-                elif 'initscript' in name:
+                #if  'info' in name:
+                    #attribute = {'name': 'flack_info', 'value': str(attribs), 'node_id': node}
+                    #slice_attributes.append(attribute)
+                #elif 'initscript' in name:
+                if 'initscript' in name:
                     if attribs is not None and 'name' in attribs:
                         value = attribs['name']
                     else:
                         value = text
                     attribute = {'name': 'initscript', 'value': value, 'node_id': node}
                     slice_attributes.append(attribute)
-
+          
+                    
+        print>>sys.stderr, "\r\n \r\n \r\n \t\t SLABV1.PY get_slice_attributes ----------------- slice_attributes %s "%(slice_attributes)
         return slice_attributes
 
     def attributes_list(self, elem):
@@ -112,6 +132,7 @@ class Slabv1(BaseVersion):
     def add_slivers(self, hostnames, attributes=[], sliver_urn=None, append=False):
         # all nodes hould already be present in the rspec. Remove all
         # nodes that done have slivers
+        print>>sys.stderr, "\r\n \r\n \r\n \t\t\t SLABv1.PY add_slivers  ----->get_node "
         for hostname in hostnames:
             node_elems = self.get_nodes({'component_id': '*%s*' % hostname})
             if not node_elems:
@@ -130,7 +151,7 @@ class Slabv1(BaseVersion):
                 continue
             sliver = {'type': requested_sliver_type,
                      'pl_tags': attributes}
-
+            print>>sys.stderr, "\r\n \r\n \r\n \t\t\t SLABv1.PY add_slivers  node_elem %s sliver_type %s \r\n \r\n " %(node_elem, sliver_type)
             # remove available element
             for available_elem in node_elem.xpath('./default:available | ./available'):
                 node_elem.remove(available_elem)
@@ -215,36 +236,14 @@ class Slabv1Request(Slabv1):
     content_type = 'request'
     schema = 'http://senslab.info/resources/rspec/1/request.xsd'
     #http://www.geni.net/resources/rspec/3/request.xsd
-    template = '<rspec type="advertisement" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://senslab.info/resources/rspec/1" xmlns:flack="http://senslab.info/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://senslab.info/resources/rspec/1 http://senslab.info/resources/rspec/1/ad.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
+    template = '<rspec type="request" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://senslab.info/resources/rspec/1" xmlns:flack="http://senslab.info/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://senslab.info/resources/rspec/1 http://senslab.info/resources/rspec/1/request.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
 
 class Slabv1Manifest(Slabv1):
     enabled = True
     content_type = 'manifest'
     schema = 'http://senslab.info/resources/rspec/1/manifest.xsd'
     #http://www.geni.net/resources/rspec/3/manifest.xsd
-    template = '<rspec type="advertisement" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://senslab.info/resources/rspec/1" xmlns:flack="http://senslab.info/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://senslab.info/resources/rspec/1 http://senslab.info/resources/rspec/1/ad.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
-#class Slabv1Ad(Slabv1):
-    #enabled = True
-    #content_type = 'ad'
-    #schema = 'http://senslab.info/resources/rspec/1/ad.xsd'
-    ##http://www.geni.net/resources/rspec/3/ad.xsd'
-    #template = '<rspec type="advertisement" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.geni.net/resources/rspec/3" xmlns:flack="http://www.protogeni.net/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/ad.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
-
-#class Slabv1Request(Slabv1):
-    #enabled = True
-    #content_type = 'request'
-    #schema = 'http://senslab.info/resources/rspec/1/request.xsd'
-    ##http://www.geni.net/resources/rspec/3/request.xsd
-    #template = '<rspec type="request" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.geni.net/resources/rspec/3" xmlns:flack="http://www.protogeni.net/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/request.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
-
-#class Slabv1Manifest(Slabv1):
-    #enabled = True
-    #content_type = 'manifest'
-    #schema = 'http://senslab.info/resources/rspec/1/manifest.xsd'
-    ##http://www.geni.net/resources/rspec/3/manifest.xsd
-    #template = '<rspec type="manifest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.geni.net/resources/rspec/3" xmlns:flack="http://www.protogeni.net/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://www.geni.net/resources/rspec/3 http://www.geni.net/resources/rspec/3/manifest.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
-
-     
+    template = '<rspec type="manifest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://senslab.info/resources/rspec/1" xmlns:flack="http://senslab.info/resources/rspec/ext/flack/1" xmlns:planetlab="http://www.planet-lab.org/resources/sfa/ext/planetlab/1" xsi:schemaLocation="http://senslab.info/resources/rspec/1 http://senslab.info/resources/rspec/1/manifest.xsd http://www.planet-lab.org/resources/sfa/ext/planetlab/1 http://www.planet-lab.org/resources/sfa/ext/planetlab/1/planetlab.xsd"/>'
 
 
 if __name__ == '__main__':
index fa7e0f9..99df7f2 100644 (file)
@@ -105,18 +105,18 @@ class OARrestapi:
         print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI username",username
         try:
             self.oarserver['uri'] = OARrequest_post_uri_dict[request]['uri']
-            print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI rq %s datadict %s  " % ( self.oarserver['uri'] ,datadict)
+            #print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI rq %s datadict %s  " % ( self.oarserver['uri'] ,datadict)
 
         except:
             print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI request not in OARrequest_post_uri_dict"
             return
         try:
-            print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI  %s " %( 'strval' in datadict)
+            #print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI  %s " %( 'strval' in datadict)
             if datadict and 'strval' in datadict:
                 self.oarserver['uri'] = self.oarserver['uri'].replace("id",str(datadict['strval']))
-                print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI REPLACE OK %s"%(self.oarserver['uri'])
+                #print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI REPLACE OK %s"%(self.oarserver['uri'])
                 del datadict['strval']
-                print>>sys.stderr, " \r\n \r\n \t POSTRequestToOARRestAPI datadict %s  rq %s" %(datadict, self.oarserver['uri'] )
+                #print>>sys.stderr, " \r\n \r\n \t POSTRequestToOARRestAPI datadict %s  rq %s" %(datadict, self.oarserver['uri'] )
         except:
             print>>sys.stderr, " \r\n \r\n POSTRequestToOARRestAPI ERRRRRORRRRRR "
             return
@@ -129,7 +129,7 @@ class OARrestapi:
         try :
             #self.oarserver['postformat'] = POSTformat[format]
             
-            print>>sys.stderr, "\r\n POSTRequestToOARRestAPI   headers %s uri %s" %(headers,self.oarserver['uri'])
+            #print>>sys.stderr, "\r\n POSTRequestToOARRestAPI   headers %s uri %s" %(headers,self.oarserver['uri'])
             conn = httplib.HTTPConnection(self.oarserver['ip'],self.oarserver['port'])
             conn.request("POST",self.oarserver['uri'],data,headers )
             resp = ( conn.getresponse()).read()
index c26f865..3298b29 100644 (file)
@@ -18,12 +18,12 @@ def strip_dictionnary (dict_to_strip):
 
 def filter_return_fields( dict_to_filter, return_fields):
        filtered_dict = {}
-       print>>sys.stderr, " \r\n \t \tfilter_return_fields return fields %s " %(return_fields)
+       #print>>sys.stderr, " \r\n \t \tfilter_return_fields return fields %s " %(return_fields)
        for field in return_fields:
                #print>>sys.stderr, " \r\n \t \tfield %s " %(field)     
                if field in dict_to_filter:
                        filtered_dict[field] = dict_to_filter[field]
-       print>>sys.stderr, " \r\n \t\t filter_return_fields filtered_dict %s " %(filtered_dict)
+       #print>>sys.stderr, " \r\n \t\t filter_return_fields filtered_dict %s " %(filtered_dict)
        return filtered_dict
        
        
@@ -36,12 +36,12 @@ def parse_filter(list_to_filter, param_filter, type_of_list, return_fields=None)
          'slice':{'str':'slice_hrn','int':'record_id_slice'},\
           'peers':{'str':'hrn'}}
                
-       print>>sys.stderr, " \r\n ___ parse_filter param_filter %s type %s  return fields %s " %(param_filter,type_of_list, return_fields)  
+       #print>>sys.stderr, " \r\n ___ parse_filter param_filter %s type %s  return fields %s " %(param_filter,type_of_list, return_fields)  
        if  param_filter is None and return_fields is None:
             return list_to_filter
         
        if type_of_list not in list_type:
-               print>>sys.stderr, " \r\n type_of_list Error  parse_filter %s " %(type_of_list)
+               #print>>sys.stderr, " \r\n type_of_list Error  parse_filter %s " %(type_of_list)
                return []
 
        return_filtered_list= []
@@ -65,7 +65,7 @@ def parse_filter(list_to_filter, param_filter, type_of_list, return_fields=None)
                                        
                                if type(p_filter) is str:
                                        if item[list_type[type_of_list]['str']] == str(p_filter) :
-                                                print>>sys.stderr, " \r\n p_filter %s \t item %s "%(p_filter,item[list_type[type_of_list]['str']])
+                                                #print>>sys.stderr, " \r\n p_filter %s \t item %s "%(p_filter,item[list_type[type_of_list]['str']])
                                                if return_fields:
                                                        tmp_item = filter_return_fields(item,return_fields)
                                                else:
@@ -99,7 +99,7 @@ def parse_filter(list_to_filter, param_filter, type_of_list, return_fields=None)
 
                         if founditem: 
                             if return_fields:
-                                print>>sys.stderr, "  \r\n \r\n parsing.py param_filter dflt %s founditem %s " %(dflt, founditem)
+                                #print>>sys.stderr, "  \r\n \r\n parsing.py param_filter dflt %s founditem %s " %(dflt, founditem)
                                 tmp_item = filter_return_fields(founditem[0],return_fields)
                             else:
                                 tmp_item = founditem[0]
index d1d2cbb..e35bc9c 100644 (file)
@@ -1,6 +1,3 @@
-
-#!/usr/bin/python
-
 # import modules used here -- sys is a very standard one
 import sys
 import httplib
@@ -8,8 +5,8 @@ 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
@@ -18,16 +15,12 @@ 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):
@@ -35,7 +28,6 @@ def hostname_to_hrn(root_auth,login_base,hostname):
 
 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):
         """
@@ -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
@@ -171,7 +121,7 @@ class SlabAggregate:
        
         #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)
+        #print>>sys.stderr, "\r\n \r\n \t get_nodes nodes %s" %(nodes)
         
         #site_ids = []
         #interface_ids = []
@@ -190,7 +140,7 @@ 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:
@@ -282,12 +232,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', [])
index 86c0fb0..41d98db 100644 (file)
@@ -43,9 +43,8 @@ def list_to_dict(recs, key):
     convert a list of dictionaries into a dictionary keyed on the 
     specified dictionary key 
     """
-   # print>>sys.stderr, " \r\n \t\t 1list_to_dict : rec %s  \r\n \t\t list_to_dict key %s" %(recs,key)   
+
     keys = [rec[key] for rec in recs]
-    #print>>sys.stderr, " \r\n \t\t list_to_dict : rec %s  \r\n \t\t list_to_dict keys %s" %(recs,keys)   
     return dict(zip(keys, recs))
 
 # thierry : note
@@ -63,16 +62,11 @@ class SlabDriver(Driver):
 
         
        print >>sys.stderr, "\r\n_____________ SFA SENSLAB DRIVER \r\n" 
-        # thierry - just to not break the rest of this code
-
 
-       #self.oar = OARapi()
         self.oar = OARrestapi()
        self.ldap = LDAPapi()
-        #self.users = SenslabImportUsers()
         self.time_format = "%Y-%m-%d %H:%M:%S"
         self.db = SlabDB(config)
-        #self.logger=sfa_logger()
         self.cache=None
         
 
@@ -98,9 +92,7 @@ class SlabDriver(Driver):
             if len(nodes) is 0:
                 raise SliverDoesNotExist("No slivers allocated ") 
                     
-             
-           
-    
+
             result = {}
             top_level_status = 'unknown'
             if nodes:
@@ -125,7 +117,7 @@ class SlabDriver(Driver):
                 sliver_id = urn_to_sliver_id(slice_urn, sl['record_id_slice'],nodeall_byhostname[node]['node_id'] ) 
                 res['geni_urn'] = sliver_id 
                 if nodeall_byhostname[node]['boot_state'] == 'Alive':
-                #if node['boot_state'] == 'Alive':
+
                     res['geni_status'] = 'ready'
                 else:
                     res['geni_status'] = 'failed'
@@ -142,43 +134,47 @@ class SlabDriver(Driver):
         
         
     def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, users, options):
+        print>>sys.stderr, "\r\n \r\n \t=============================== SLABDRIVER.PY create_sliver "
         aggregate = SlabAggregate(self)
-
+        
         slices = SlabSlices(self)
         peer = slices.get_peer(slice_hrn)
         sfa_peer = slices.get_sfa_peer(slice_hrn)
         slice_record=None 
-
-       
         if not isinstance(creds, list):
             creds = [creds]
-
-           
+    
         if users:
             slice_record = users[0].get('slice_record', {})
     
         # parse rspec
         rspec = RSpec(rspec_string)
-        requested_attributes = rspec.version.get_slice_attributes()
+        print>>sys.stderr, "\r\n \r\n \t=============================== SLABDRIVER.PY create_sliver  ============================rspec.version %s " %(rspec.version)
         
-        # ensure site record exists
-        #site = slices.verify_site(slice_hrn, slice_record, peer, sfa_peer, options=options)
+        
+        # ensure site record exists?
         # ensure slice record exists
         slice = slices.verify_slice(slice_hrn, slice_record, peer, sfa_peer, options=options)
+        requested_attributes = rspec.version.get_slice_attributes()
+        
+        if requested_attributes:
+            for attrib_dict in requested_attributes:
+                if 'timeslot' in attrib_dict:
+                    slice.update({'timeslot':attrib_dict['timeslot']})
+        print >>sys.stderr, "\r\n \r\n \t=============================== SLABDRIVER.PY create_sliver  ..... slice %s " %(slice)
         # ensure person records exists
         persons = slices.verify_persons(slice_hrn, slice, users, peer, sfa_peer, options=options)
-        # ensure slice attributes exists
-        #slices.verify_slice_attributes(slice, requested_attributes, options=options)
+        # ensure slice attributes exists?
+
         
-        # add/remove slice from nodes
+        # add/remove slice from nodes 
+        print >>sys.stderr, "\r\n \r\n \t=============================== SLABDRIVER.PY create_sliver  ..... " 
+       
         requested_slivers = [node.get('component_name') for node in rspec.version.get_nodes_with_slivers()]
+        print >>sys.stderr, "\r\n \r\n \t=============================== ........... requested_slivers ============================requested_slivers %s " %(requested_slivers)
         nodes = slices.verify_slice_nodes(slice, requested_slivers, peer) 
     
-      
-    
-        # handle MyPLC peer association.
-        # only used by plc and ple.
-        #slices.handle_peer(site, slice, persons, peer)
         
         return aggregate.get_rspec(slice_xrn=slice_urn, version=rspec.version)
         
@@ -205,9 +201,7 @@ class SlabDriver(Driver):
                 self.BindObjectToPeer('slice', slice['slice_id'], peer, slice['peer_slice_id'])
         return 1
             
-            
-            
-            
     # first 2 args are None in case of resource discovery
     def list_resources (self, slice_urn, slice_hrn, creds, options):
         #cached_requested = options.get('cached', True) 
@@ -229,12 +223,12 @@ class SlabDriver(Driver):
                 #return rspec 
     
         #panos: passing user-defined options
-        #print "manager options = ",options
+
         aggregate = SlabAggregate(self)
         origin_hrn = Credential(string=creds[0]).get_gid_caller().get_hrn()
-        print>>sys.stderr, " \r\n \r\n \t SLABDRIVER list_resources origin_hrn %s" %(origin_hrn)
+        #print>>sys.stderr, " \r\n \r\n \t SLABDRIVER list_resources origin_hrn %s" %(origin_hrn)
         options.update({'origin_hrn':origin_hrn})
-        print>>sys.stderr, " \r\n \r\n \t SLABDRIVER  list_resources options %s" %(options)
+        #print>>sys.stderr, " \r\n \r\n \t SLABDRIVER  list_resources options %s" %(options)
         rspec =  aggregate.get_rspec(slice_xrn=slice_urn, version=rspec_version, 
                                      options=options)
         print>>sys.stderr, " \r\n \r\n \t SLABDRIVER list_resources rspec " 
@@ -272,13 +266,7 @@ class SlabDriver(Driver):
         type = sfa_record['type']
         slab_record = self.sfa_fields_to_slab_fields(type, hrn, sfa_record)
     
-        #if type == 'authority':
-            #sites = self.shell.GetSites([slab_record['login_base']])
-            #if not sites:
-                #pointer = self.shell.AddSite(slab_record)
-            #else:
-                #pointer = sites[0]['site_id']
-    
+
         if type == 'slice':
             acceptable_fields=['url', 'instantiation', 'name', 'description']
             for key in slab_record.keys():
@@ -316,14 +304,7 @@ class SlabDriver(Driver):
                 self.AddPersonKey(pointer, {'key_type' : 'ssh', 'key' : pub_key})
                 
         #No node adding outside OAR
-        #elif type == 'node':
-            #login_base = hrn_to_slab_login_base(sfa_record['authority'])
-            #nodes = self.GetNodes([slab_record['hostname']])
-            #if not nodes:
-                #pointer = self.AddNode(login_base, slab_record)
-            #else:
-                #pointer = nodes[0]['node_id']
-    
+
         return pointer
             
     #No site or node record update allowed       
@@ -370,9 +351,7 @@ class SlabDriver(Driver):
                         key_exists = True
                 if not key_exists:
                     self.AddPersonKey(pointer, {'key_type': 'ssh', 'key': new_key})
-    
-        #elif type == "node":
-            #self.UpdateNode(pointer, new_sfa_record)
+
 
         return True
         
@@ -499,11 +478,11 @@ class SlabDriver(Driver):
         node_dict = dict(zip(node_hostname_list,node_list))
         try :
             liste =job_info[node_list_k] 
-            print>>sys.stderr, "\r\n \r\n \t\t GetJobs resources  job_info liste%s" %(liste)
+            #print>>sys.stderr, "\r\n \r\n \t\t GetJobs resources  job_info liste%s" %(liste)
             for k in range(len(liste)):
                job_info[node_list_k][k] = node_dict[job_info[node_list_k][k]]['hostname']
             
-            print>>sys.stderr, "\r\n \r\n \t\t YYYYYYYYYYYYGetJobs resources  job_info %s" %(job_info)  
+            #print>>sys.stderr, "\r\n \r\n \t\t YYYYYYYYYYYYGetJobs resources  job_info %s" %(job_info)  
             #Replaces the previous entry "assigned_network_address" / "reserved_resources"
             #with "node_ids"
             job_info.update({'node_ids':job_info[node_list_k]})
@@ -523,9 +502,8 @@ class SlabDriver(Driver):
        return nodes
      
     def GetNodes(self,node_filter= None, return_fields=None):
-               
         node_dict =self.oar.parser.SendRequest("GET_resources_full")
-        print>>sys.stderr, "\r\n \r\n \t\t  SLABDRIVER.PY GetNodes " 
+
         return_node_list = []
         if not (node_filter or return_fields):
                 return_node_list = node_dict.values()
@@ -537,7 +515,6 @@ class SlabDriver(Driver):
   
     def GetSites(self, site_filter = None, return_fields=None):
         site_dict =self.oar.parser.SendRequest("GET_sites")
-        print>>sys.stderr, "\r\n \r\n \t\t  SLABDRIVER.PY GetSites " 
         return_site_list = []
         if not ( site_filter or return_fields):
                 return_site_list = site_dict.values()
@@ -561,10 +538,10 @@ class SlabDriver(Driver):
             if slicerec:
                 rec = slicerec.dumpquerytodict()
                 login = slicerec.slice_hrn.split(".")[1].split("_")[0]
-                print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY slicerec GetSlices   %s " %(slicerec)
+                #print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY slicerec GetSlices   %s " %(slicerec)
                 if slicerec.oar_job_id is not -1:
                     rslt = self.GetJobs( slicerec.oar_job_id, resources=False, username = login )
-                    print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY  GetSlices  GetJobs  %s " %(rslt)     
+                    #print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY  GetSlices  GetJobs  %s " %(rslt)     
                     if rslt :
                         rec.update(rslt)
                         rec.update({'hrn':str(rec['slice_hrn'])})
@@ -575,7 +552,12 @@ class SlabDriver(Driver):
                         rec['oar_job_id'] = -1
                         rec.update({'hrn':str(rec['slice_hrn'])})
             
-                print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY  GetSlices  rec  %s" %(rec)
+                try:
+                    rec['node_ids'] = rec['node_list']
+                except KeyError:
+                    pass
+                
+                #print >>sys.stderr, " \r\n \r\n \tSLABDRIVER.PY  GetSlices  rec  %s" %(rec)
                               
             return rec
                 
@@ -678,15 +660,21 @@ class SlabDriver(Driver):
 
         return slab_record
 
-  
-                 
-                 
-    def AddSliceToNodes(self,  slice_name, added_nodes, slice_user=None):
+                   
+    def AddSliceToNodes(self,  slice_dict, added_nodes, slice_user=None):
        
         site_list = []
         nodeid_list =[]
         resource = ""
         reqdict = {}
+        slice_name = slice_dict['name']
+        try:
+            slot = slice_dict['timeslot']
+        except KeyError:
+            slot = { 'time':None, 'duration':'00:10:00' }#10 min 
+            reqdict['resource']+= ",walltime=" + str(00) + ":" + str(12) + ":" + str(20) #+2 min 20
+            reqdict['script_path'] = "/bin/sleep 620" #+20 sec
+            
         reqdict['property'] ="network_address in ("
         for node in added_nodes:
             #Get the ID of the node : remove the root auth and put the site in a separate list
@@ -701,42 +689,95 @@ class SlabDriver(Driver):
             reqdict['property'] += "'"+ nodeid +"', "
             nodeid_list.append(nodeid)
             #site_list.append( l[0] )
+            
+            
         reqdict['property'] =  reqdict['property'][0: len( reqdict['property'])-2] +")"
         reqdict['resource'] ="network_address="+ str(len(nodeid_list))
-        reqdict['resource']+= ",walltime=" + str(00) + ":" + str(12) + ":" + str(20) #+2 min 20
-        reqdict['script_path'] = "/bin/sleep 620" #+20 sec
+        
+
+        #In case of a scheduled experiment
+        if slot['time']:
+            
+            walltime = slot['duration'].split(":")
+            # Fixing the walltime by adding a few delays. First put the walltime in seconds
+            # oarAdditionalDelay = 20; additional delay for /bin/sleep command to
+            # take in account  prologue and epilogue scripts execution
+            # int walltimeAdditionalDelay = 120;  additional delay
+            desired_walltime =  int(walltime[0])*3600 + int(walltime[1]) * 60 + int(walltime[2])
+            total_walltime = desired_walltime + 140 #+2 min 20
+            sleep_walltime = desired_walltime + 20 #+20 sec
+            print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes desired_walltime %s  total_walltime %s sleep_walltime %s  " %(desired_walltime,total_walltime,sleep_walltime)
+            #Put the walltime back in str form
+            #First get the hours
+            walltime[0] = str(total_walltime / 3600)
+            total_walltime = total_walltime - 3600 * int(walltime[0])
+            #Get the remaining minutes
+            walltime[1] = str(total_walltime / 60)
+            total_walltime =  total_walltime - 60 * int(walltime[1])
+            #Get the seconds
+            walltime[2] = str(total_walltime)
+            print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes  walltime %s " %(walltime)
+
+            reqdict['resource']+= ",walltime=" + str(walltime[0]) + ":" + str(walltime[1]) + ":" + str(walltime[2]) 
+            reqdict['script_path'] = "/bin/sleep " + str(sleep_walltime)
+            
+            #Get the reservation time
+            parse_time = slot['time'].split(" ")
+            date = ' '.join(parse_time[:-1])
+            #Get zone of the user from the reservation time given in the rspec
+            from_zone = tz.gettz(parse_time[2])
+            user_datetime = datetime.datetime.strptime(date, self.time_format)
+            user_datetime = user_datetime.replace(tzinfo = from_zone)
+            
+            #Convert to UTC zone
+            to_zone = tz.tzutc()
+            utc_date = user_datetime.astimezone(to_zone)
+            #Readable time accpeted by OAR
+            reqdict['reservation']= utc_date.strftime(self.time_format)
+        
+            print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes  reqdict['reservation'] %s " %(reqdict['reservation'])
+            
+        else:
+            # Immediate XP
+            # reservations are performed in the oar server timebase, so :
+            # 1- we get the server time(in UTC tz )/server timezone
+            # 2- convert the server UTC time in its timezone
+            # 3- add a custom delay to this time
+            # 4- convert this time to a readable form and it for the reservation request.
+            server_timestamp,server_tz = self.GetTimezone()
+            s_tz=tz.gettz(server_tz)
+            UTC_zone = tz.gettz("UTC")
+            #weird... datetime.fromtimestamp should work since we do from datetime import datetime
+            utc_server= datetime.datetime.fromtimestamp(float(server_timestamp)+20,UTC_zone)
+            server_localtime=utc_server.astimezone(s_tz)
+    
+            print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes server_timestamp %s server_tz %s slice_name %s added_nodes %s username %s reqdict %s " %(server_timestamp,server_tz,slice_name,added_nodes,slice_user, reqdict )
+            readable_time = server_localtime.strftime(self.time_format)
+
+            print >>sys.stderr,"  \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s  " %(readable_time ,server_timestamp)
+            reqdict['reservation'] = readable_time
+        
+
         reqdict['type'] = "deploy" 
         reqdict['directory']= ""
         reqdict['name']= "TestSandrine"
-        # reservations are performed in the oar server timebase, so :
-        # 1- we get the server time(in UTC tz )/server timezone
-        # 2- convert the server UTC time in its timezone
-        # 3- add a custom delay to this time
-        # 4- convert this time to a readable form and it for the reservation request.
-        server_timestamp,server_tz = self.GetTimezone()
-        s_tz=tz.gettz(server_tz)
-        UTC_zone = tz.gettz("UTC")
-        #weird... datetime.fromtimestamp should work since we do from datetime import datetime
-        utc_server= datetime.datetime.fromtimestamp(float(server_timestamp)+20,UTC_zone)
-        server_localtime=utc_server.astimezone(s_tz)
-
-        print>>sys.stderr, "\r\n \r\n AddSliceToNodes  slice_name %s added_nodes %s username %s reqdict %s " %(slice_name,added_nodes,slice_user, reqdict)
-        readable_time = server_localtime.strftime(self.time_format)
-
-        print >>sys.stderr,"  \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s  " %(readable_time ,server_timestamp)
-        reqdict['reservation'] = readable_time
+       
          
-        # first step : start the OAR job
+        # first step : start the OAR job and update the job 
         print>>sys.stderr, "\r\n \r\n AddSliceToNodes reqdict   %s \r\n site_list   %s"  %(reqdict,site_list)   
-        #OAR = OARrestapi()
+       
         answer = self.oar.POSTRequestToOARRestAPI('POST_job',reqdict,slice_user)
         print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid   %s "  %(answer)
-        #self.db.update('slice',['oar_job_id'], [answer['id']], 'slice_hrn', slice_name)
-               
-
-        self.db.update_job( slice_name, job_id = answer['id'] )
-        jobid=answer['id']
-        print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid    %s added_nodes  %s slice_user %s"  %(jobid,added_nodes,slice_user)  
+        try:       
+            jobid = answer['id']
+        except KeyError:
+             print>>sys.stderr, "\r\n AddSliceTonode Impossible to create job  %s "  %( answer)
+             return
+        
+        print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid    %s added_nodes  %s slice_user %s"  %(jobid,added_nodes,slice_user)
+        self.db.update_job( slice_name, jobid ,added_nodes)
+        
+          
         # second step : configure the experiment
         # we need to store the nodes in a yaml (well...) file like this :
         # [1,56,23,14,45,75] with name /tmp/sfa<jobid>.json
@@ -757,6 +798,88 @@ class SlabDriver(Driver):
 
         print>>sys.stderr, "\r\n \r\n AddSliceToNodes wrapper returns   %s "  %(output)
         return 
+                 
+                 
+    #def AddSliceToNodes(self,  slice_name, added_nodes, slice_user=None):
+       
+        #site_list = []
+        #nodeid_list =[]
+        #resource = ""
+        #reqdict = {}
+        #reqdict['property'] ="network_address in ("
+        #for node in added_nodes:
+            ##Get the ID of the node : remove the root auth and put the site in a separate list
+            #s=node.split(".")
+            ## NT: it's not clear for me if the nodenames will have the senslab prefix
+            ## so lets take the last part only, for now.
+            #lastpart=s[-1]
+            ##if s[0] == self.root_auth :
+            ## Again here it's not clear if nodes will be prefixed with <site>_, lets split and tanke the last part for now.
+            #s=lastpart.split("_")
+            #nodeid=s[-1]
+            #reqdict['property'] += "'"+ nodeid +"', "
+            #nodeid_list.append(nodeid)
+            ##site_list.append( l[0] )
+        #reqdict['property'] =  reqdict['property'][0: len( reqdict['property'])-2] +")"
+        #reqdict['resource'] ="network_address="+ str(len(nodeid_list))
+        #reqdict['resource']+= ",walltime=" + str(00) + ":" + str(12) + ":" + str(20) #+2 min 20
+        #reqdict['script_path'] = "/bin/sleep 620" #+20 sec
+        #reqdict['type'] = "deploy" 
+        #reqdict['directory']= ""
+        #reqdict['name']= "TestSandrine"
+        ## reservations are performed in the oar server timebase, so :
+        ## 1- we get the server time(in UTC tz )/server timezone
+        ## 2- convert the server UTC time in its timezone
+        ## 3- add a custom delay to this time
+        ## 4- convert this time to a readable form and it for the reservation request.
+        #server_timestamp,server_tz = self.GetTimezone()
+        #s_tz=tz.gettz(server_tz)
+        #UTC_zone = tz.gettz("UTC")
+        ##weird... datetime.fromtimestamp should work since we do from datetime import datetime
+        #utc_server= datetime.datetime.fromtimestamp(float(server_timestamp)+20,UTC_zone)
+        #server_localtime=utc_server.astimezone(s_tz)
+
+        #print>>sys.stderr, "\r\n \r\n \t\tAddSliceToNodes server_timestamp %s server_tz %s slice_name %s added_nodes %s username %s reqdict %s " %(server_timestamp,server_tz,slice_name,added_nodes,slice_user, reqdict )
+        #readable_time = server_localtime.strftime(self.time_format)
+
+        #print >>sys.stderr,"  \r\n \r\n \t\t\t\tAPRES ParseTimezone readable_time %s timestanp %s  " %(readable_time ,server_timestamp)
+        #reqdict['reservation'] = readable_time
+         
+        ## first step : start the OAR job and update the job 
+        #print>>sys.stderr, "\r\n \r\n AddSliceToNodes reqdict   %s \r\n site_list   %s"  %(reqdict,site_list)   
+       
+        #answer = self.oar.POSTRequestToOARRestAPI('POST_job',reqdict,slice_user)
+        #print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid   %s "  %(answer)
+        #try:       
+            #jobid = answer['id']
+        #except KeyError:
+             #print>>sys.stderr, "\r\n AddSliceTonode Impossible to create job  %s "  %( answer)
+             #return
+        
+        #print>>sys.stderr, "\r\n \r\n AddSliceToNodes jobid    %s added_nodes  %s slice_user %s"  %(jobid,added_nodes,slice_user)
+        #self.db.update_job( slice_name, jobid ,added_nodes)
+        
+          
+        ## second step : configure the experiment
+        ## we need to store the nodes in a yaml (well...) file like this :
+        ## [1,56,23,14,45,75] with name /tmp/sfa<jobid>.json
+        #f=open('/tmp/sfa/'+str(jobid)+'.json','w')
+        #f.write('[')
+        #f.write(str(added_nodes[0].strip('node')))
+        #for node in added_nodes[1:len(added_nodes)] :
+            #f.write(','+node.strip('node'))
+        #f.write(']')
+        #f.close()
+        
+        ## third step : call the senslab-experiment wrapper
+        ##command= "java -jar target/sfa-1.0-jar-with-dependencies.jar "+str(jobid)+" "+slice_user
+        #javacmdline="/usr/bin/java"
+        #jarname="/opt/senslabexperimentwrapper/sfa-1.0-jar-with-dependencies.jar"
+        ##ret=subprocess.check_output(["/usr/bin/java", "-jar", ", str(jobid), slice_user])
+        #output = subprocess.Popen([javacmdline, "-jar", jarname, str(jobid), slice_user],stdout=subprocess.PIPE).communicate()[0]
+
+        #print>>sys.stderr, "\r\n \r\n AddSliceToNodes wrapper returns   %s "  %(output)
+        #return 
     
 
         
@@ -917,7 +1040,7 @@ class SlabDriver(Driver):
             for record in parkour:
                     
                 if str(record['type']) == 'slice':
-                    print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY  fill_record_info \t \t record %s" %(record)
+                    #print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY  fill_record_info \t \t record %s" %(record)
                     #sfatable = SfaTable()
                     
                     #existing_records_by_id = {}
@@ -929,13 +1052,13 @@ class SlabDriver(Driver):
                     #recslice = self.db.find('slice',{'slice_hrn':str(record['hrn'])}) 
                     #recslice = slab_dbsession.query(SliceSenslab).filter_by(slice_hrn = str(record['hrn'])).first()
                     recslice = self.GetSlices(slice_filter =  str(record['hrn']), filter_type = 'slice_hrn')
-                    print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info \t\t HOY HOY reclise %s" %(recslice)
+                    #print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info \t\t HOY HOY reclise %s" %(recslice)
                     #if isinstance(recslice,list) and len(recslice) == 1:
                         #recslice = recslice[0]
                    
                     recuser = dbsession.query(RegRecord).filter_by(record_id = recslice['record_id_user']).first()
                     #existing_records_by_id[recslice['record_id_user']]
-                    print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info \t\t recuser %s" %(recuser)
+                    #print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info \t\t recuser %s" %(recuser)
                     
           
                     record.update({'PI':[recuser.hrn],
@@ -946,7 +1069,7 @@ class SlabDriver(Driver):
                     'person_ids':[recslice['record_id_user']]})
                     
                 elif str(record['type']) == 'user':
-                    print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info USEEEEEEEEEERDESU!" 
+                    #print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info USEEEEEEEEEERDESU!" 
 
                     rec = self.GetSlices(slice_filter = record['record_id'], filter_type = 'record_id_user')
                     #Append record in records list, therfore fetches user and slice info again(one more loop)
@@ -954,7 +1077,7 @@ class SlabDriver(Driver):
 
                     rec.update({'type':'slice','hrn':rec['slice_hrn']})
                     records.append(rec)
-                    print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info ADDING SLIC EINFO rec %s" %(rec) 
+                    #print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info ADDING SLIC EINFO rec %s" %(rec) 
                     
             print >>sys.stderr, "\r\n \t\t  SLABDRIVER.PY fill_record_info OKrecords %s" %(records) 
         except TypeError:
index 40faae3..96e0034 100644 (file)
@@ -220,12 +220,12 @@ class SlabSlices:
         print>>sys.stderr, " \r\n \r\n \t slices.py get_peer slice_authority  %s site_authority %s " %(slice_authority, site_authority)
         # check if we are already peered with this site_authority, if so
         peers = self.driver.GetPeers({})
-        print>>sys.stderr, " \r\n \r\n \t slices.py get_peer peers %s " %(peers)
+        #print>>sys.stderr, " \r\n \r\n \t slices.py get_peer peers %s " %(peers)
         for peer_record in peers:
           
             if site_authority == peer_record.hrn:
                 peer = peer_record
-        print>>sys.stderr, " \r\n \r\n \t slices.py get_peer peer  %s " %(peer) 
+        #print>>sys.stderr, " \r\n \r\n \t slices.py get_peer peer  %s " %(peer) 
         return peer
 
     def get_sfa_peer(self, xrn):
@@ -244,6 +244,7 @@ class SlabSlices:
     def verify_slice_nodes(self, slice, requested_slivers, peer):
         current_slivers = []
         deleted_nodes = []
+        
         if slice['node_ids']:
             nodes = self.driver.GetNodes(slice['node_ids'], ['hostname'])
             current_slivers = [node['hostname'] for node in nodes]
@@ -253,7 +254,7 @@ class SlabSlices:
     
         # add nodes from rspec
         added_nodes = list(set(requested_slivers).difference(current_slivers))        
-        print>>sys.stderr , "\r\n \r\n \t slices.py  verify_slice_nodes added_nodes %s slice %s" %( added_nodes,slice)
+        #print>>sys.stderr , "\r\n \r\n \t slices.py  verify_slice_nodes added_nodes %s slice %s" %( added_nodes,slice)
         try:
             #if peer:
                 #self.driver.UnBindObjectFromPeer('slice', slice['slice_id'], peer['shortname'])
@@ -261,7 +262,8 @@ class SlabSlices:
             #so that the OAR/LDAP knows the user: remove the authority from the name
             tmp=  slice['PI'][0].split(".")
             username = tmp[(len(tmp)-1)]
-            self.driver.AddSliceToNodes(slice['name'], added_nodes, username)
+            self.driver.AddSliceToNodes(slice, added_nodes, username)
+            #self.driver.AddSliceToNodes(slice['name'], added_nodes, username)
             
             if deleted_nodes:
                 self.driver.DeleteSliceFromNodes(slice['name'], deleted_nodes)
@@ -475,7 +477,7 @@ class SlabSlices:
         # update_existing users
         updated_users_list = [user for user in existing_slice_users if user['hrn'] in \
           updated_user_hrns]
-        print>>sys.stderr, " \r\n \r\n slices.py verify_persons  removed_user_hrns %s updated_users_list %s " %(removed_user_hrns,updated_users_list) 
+        #print>>sys.stderr, " \r\n \r\n slices.py verify_persons  removed_user_hrns %s updated_users_list %s " %(removed_user_hrns,updated_users_list) 
         #self.verify_keys(existing_slice_users, updated_users_list, peer, append)
 
         added_persons = []