Allocate, Describe, Provision now working for iotlab.
authorSandrine Avakian <sandrine.avakian@inria.fr>
Tue, 10 Dec 2013 12:42:55 +0000 (13:42 +0100)
committerSandrine Avakian <sandrine.avakian@inria.fr>
Tue, 10 Dec 2013 12:42:55 +0000 (13:42 +0100)
sfa/iotlab/iotlabaggregate.py
sfa/iotlab/iotlabdriver.py
sfa/iotlab/iotlabshell.py
sfa/iotlab/iotlabslices.py
sfa/iotlab/iotlabxrn.py
sfa/rspecs/elements/versions/iotlabv1Node.py
testbeds/iotlab/tests/tests_rspecs/iotlab_avakian_slice_iotlab2.rspec
testbeds/iotlab/tests/tests_rspecs/iotlab_user_slice_iotlab.rspec

index 8977e20..d57943e 100644 (file)
@@ -3,8 +3,9 @@ File providing methods to generate valid RSpecs for the Iotlab testbed.
 Contains methods to get information on slice, slivers, nodes and leases,
 formatting them and turn it into a RSpec.
 """
 Contains methods to get information on slice, slivers, nodes and leases,
 formatting them and turn it into a RSpec.
 """
-from sfa.util.xrn import hrn_to_urn, urn_to_hrn, get_authority
-
+from sfa.util.sfatime import utcparse, datetime_to_string
+from sfa.util.xrn import Xrn, hrn_to_urn, urn_to_hrn, get_authority
+from sfa.iotlab.iotlabxrn import IotlabXrn
 from sfa.rspecs.rspec import RSpec
 #from sfa.rspecs.elements.location import Location
 from sfa.rspecs.elements.hardware_type import HardwareType
 from sfa.rspecs.rspec import RSpec
 #from sfa.rspecs.elements.location import Location
 from sfa.rspecs.elements.hardware_type import HardwareType
@@ -14,16 +15,12 @@ from sfa.rspecs.elements.sliver import Sliver
 from sfa.rspecs.elements.lease import Lease
 from sfa.rspecs.elements.granularity import Granularity
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.elements.lease import Lease
 from sfa.rspecs.elements.granularity import Granularity
 from sfa.rspecs.version_manager import VersionManager
-
+from sfa.storage.model import SliverAllocation
 from sfa.rspecs.elements.versions.iotlabv1Node import IotlabPosition, \
     IotlabNode, IotlabLocation
 from sfa.rspecs.elements.versions.iotlabv1Node import IotlabPosition, \
     IotlabNode, IotlabLocation
-
+from sfa.iotlab.iotlabxrn import xrn_object
 from sfa.util.sfalogging import logger
 from sfa.util.sfalogging import logger
-from sfa.util.xrn import Xrn
-
-
-
-
+import time
 
 class IotlabAggregate:
     """Aggregate manager class for Iotlab. """
 
 class IotlabAggregate:
     """Aggregate manager class for Iotlab. """
@@ -283,7 +280,10 @@ class IotlabAggregate:
         # return (rspec_nodes)
         return nodes_dict
 
         # return (rspec_nodes)
         return nodes_dict
 
-    def node_to_rspec_node(self, node, grain):
+    def node_to_rspec_node(self, node):
+
+        grain = self.driver.testbed_shell.GetLeaseGranularity()
+
         rspec_node = IotlabNode()
         # xxx how to retrieve site['login_base']
         #site_id=node['site_id']
         rspec_node = IotlabNode()
         # xxx how to retrieve site['login_base']
         #site_id=node['site_id']
@@ -354,6 +354,61 @@ class IotlabAggregate:
 
         return rspec_node
 
 
         return rspec_node
 
+
+    def rspec_node_to_geni_sliver(self, rspec_node, sliver_allocations = {}):
+        if rspec_node['sliver_id'] in sliver_allocations:
+            # set sliver allocation and operational status
+            sliver_allocation = sliver_allocations[rspec_node['sliver_id']]
+            if sliver_allocation:
+                allocation_status = sliver_allocation.allocation_state
+                if allocation_status == 'geni_allocated':
+                    op_status =  'geni_pending_allocation'
+                elif allocation_status == 'geni_provisioned':
+                    op_status = 'geni_ready'
+                else:
+                    op_status = 'geni_unknown'
+            else:
+                allocation_status = 'geni_unallocated'
+        else:
+            allocation_status = 'geni_unallocated'
+            op_status = 'geni_failed'
+        # required fields
+        geni_sliver = {'geni_sliver_urn': rspec_node['sliver_id'],
+                       'geni_expires': rspec_node['expires'],
+                       'geni_allocation_status' : allocation_status,
+                       'geni_operational_status': op_status,
+                       'geni_error': '',
+                       }
+        return geni_sliver
+
+
+    def sliver_to_rspec_node(self, sliver, sliver_allocations):
+        rspec_node = self.node_to_rspec_node(sliver)
+        rspec_node['expires'] = datetime_to_string(utcparse(sliver['expires']))
+        # add sliver info
+        logger.debug("IOTLABAGGREGATE api \t  sliver_to_rspec_node sliverr  %s \r\nsliver_allocations %s"
+                      % (sliver, sliver_allocations))
+        rspec_sliver = Sliver({'sliver_id': sliver['urn'],
+                         'name': sliver['slice_id'],
+                         'type': 'iotlab-exclusive',
+                         'tags': []})
+        rspec_node['sliver_id'] = rspec_sliver['sliver_id']
+        if sliver['urn'] in sliver_allocations:
+            rspec_node['client_id'] = sliver_allocations[sliver['urn']].client_id
+            if sliver_allocations[sliver['urn']].component_id:
+                rspec_node['component_id'] = sliver_allocations[sliver['urn']].component_id
+        rspec_node['slivers'] = [rspec_sliver]
+
+        # slivers always provide the ssh service
+        login = Login({'authentication': 'ssh-keys',
+                       'hostname': sliver['hostname'],
+                       'port':'22',
+                       'username': sliver['slice_name'],
+                       'login': sliver['slice_name']
+                      })
+        return rspec_node
+
+
     def get_all_leases(self, ldap_username):
         """
 
     def get_all_leases(self, ldap_username):
         """
 
@@ -526,6 +581,125 @@ class IotlabAggregate:
                        FINAL RSPEC %s \r\n" % (rspec.toxml()))
         return rspec.toxml()
 
                        FINAL RSPEC %s \r\n" % (rspec.toxml()))
         return rspec.toxml()
 
+    def get_slivers(self, urns, options={}):
+        """
+
+        """
+
+
+        slice_ids = set()
+        node_ids = []
+        for urn in urns:
+            xrn = IotlabXrn(xrn=urn)
+            if xrn.type == 'sliver':
+                 # id: slice_id-node_id
+                try:
+                    sliver_id_parts = xrn.get_sliver_id_parts()
+                    slice_id = int(sliver_id_parts[0])
+                    node_id = int(sliver_id_parts[1])
+                    slice_ids.add(slice_id)
+                    node_ids.append(node_id)
+                except ValueError:
+                    pass
+            else:
+                slice_names = set()
+                slice_names.add(xrn.hrn)
+
+
+        logger.debug("IotlabAggregate \t get_slivers urns %s slice_ids %s \
+                       node_ids %s\r\n" % (urns, slice_ids, node_ids))
+        logger.debug("IotlabAggregate \t get_slivers xrn %s slice_names %s \
+                       \r\n" % (xrn, slice_names))
+        filter = {}
+        if slice_names:
+            filter['slice_hrn'] = list(slice_names)
+            slice_hrn = filter['slice_hrn'][0]
+
+            slice_filter_type = 'slice_hrn'
+            logger.debug("IotlabAggregate \t get_slivers  slice_hrn%s \
+                       \r\n" % (slice_hrn ))
+        # if slice_ids:
+        #     filter['slice_id'] = list(slice_ids)
+        # # get slices
+        if slice_hrn:
+            slices = self.driver.testbed_shell.GetSlices(slice_hrn,
+                slice_filter_type)
+            leases = self.driver.testbed_shell.GetLeases(
+                                                {'slice_hrn':slice_hrn})
+        logger.debug("IotlabAggregate \t get_slivers \
+                       slices %s leases %s\r\n" % (slices, leases ))
+        if not slices:
+            return []
+        # slice = slices[0]
+        # slice['hrn'] = DummyXrn(auth=self.driver.hrn, slicename=slice['slice_name']).hrn
+        single_slice = slices[0]
+        # get sliver users
+        # users = []
+        # user_ids = []
+        # for slice in slices:
+        #     user_ids.extend(slice['user_ids'])
+        # if user_ids:
+        #     users = self.driver.shell.GetUsers({'user_ids': user_ids})
+
+        user = single_slice['reg_researchers'][0].__dict__
+        logger.debug("IotlabAggregate \t get_slivers user %s \
+                       \r\n" % (user))
+
+        # construct user key info
+        # users_list = []
+        # for user in users:
+        person = self.driver.testbed_shell.ldap.LdapFindUser(record=user)
+        logger.debug("IotlabAggregate \t get_slivers person %s \
+                       \r\n" % (person))
+        name = person['last_name']
+        user['login'] = person['uid']
+        user['user_urn'] = hrn_to_urn(user['hrn'], 'user')
+        user['keys'] = person['pkey']
+            # name = user['email'][0:user['email'].index('@')]
+            # user = {
+            #     'login': slice['slice_name'],
+            #     'user_urn': Xrn('%s.%s' % (self.driver.hrn, name), type='user').urn,
+            #     'keys': user['keys']
+            # }
+            # users_list.append(user)
+
+        try:
+            node_ids = single_slice['node_ids']
+            node_list = self.driver.testbed_shell.GetNodes(
+                    {'hostname':single_slice['node_ids']})
+            node_by_hostname = dict([(node['hostname'], node) for node in node_list])
+        except KeyError:
+            logger.warning("\t get_slivers No slivers in slice")
+            # slice['node_ids'] = node_ids
+        # nodes_dict = self.get_slice_nodes(slice, options)
+        logger.debug("IotlabAggregate \t get_slivers  node_by_hostname%s \
+                       \r\n" % (node_by_hostname))
+        slivers = []
+        for current_lease in leases:
+            for hostname in current_lease['reserved_nodes']:
+                node = {}
+                node['slice_id'] = current_lease['slice_id']
+                node['slice_hrn'] = current_lease['slice_hrn']
+                slice_name = current_lease['slice_hrn'].split(".")[1]
+                node['slice_name'] = slice_name
+                index = current_lease['reserved_nodes'].index(hostname)
+                node_id = current_lease['resource_ids'][index]
+                # node['slice_name'] = user['login']
+                # node.update(single_slice)
+                more_info = node_by_hostname[hostname]
+                node.update(more_info)
+                # oar_job_id is the slice_id (lease_id)
+                sliver_hrn = '%s.%s-%s' % (self.driver.hrn,
+                            current_lease['lease_id'], node_id)
+                node['node_id'] = node_id
+                node['expires'] = current_lease['t_until']
+                node['sliver_id'] = Xrn(sliver_hrn, type='sliver').urn
+                node['urn'] = node['sliver_id']
+                node['services_user'] = [user]
+                logger.debug("IotlabAggregate \t get_slivers node %s current_lease %s\
+                       \r\n more_info %s" % (node, current_lease, more_info))
+                slivers.append(node)
+        return slivers
 
     def list_resources(self, version = None, options={}):
 
 
     def list_resources(self, version = None, options={}):
 
@@ -533,7 +707,10 @@ class IotlabAggregate:
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'ad')
         rspec = RSpec(version=rspec_version, user_options=options)
         version = version_manager.get_version(version)
         rspec_version = version_manager._get_version(version.type, version.version, 'ad')
         rspec = RSpec(version=rspec_version, user_options=options)
-
+        # variable ldap_username to be compliant with the get_all_leases
+        # prototype. Now unused in geni-v3 since we are getting all the leases
+        # here
+        ldap_username = None
         if not options.get('list_leases') or options['list_leases'] != 'leases':
             # get nodes
             nodes_dict  = self.get_nodes(options)
         if not options.get('list_leases') or options['list_leases'] != 'leases':
             # get nodes
             nodes_dict  = self.get_nodes(options)
@@ -551,12 +728,11 @@ class IotlabAggregate:
             # node_tags = self.get_node_tags({'node_tag_id': tag_ids})
             # pl_initscripts = self.get_pl_initscripts()
             # convert nodes to rspec nodes
             # node_tags = self.get_node_tags({'node_tag_id': tag_ids})
             # pl_initscripts = self.get_pl_initscripts()
             # convert nodes to rspec nodes
-            grain = self.driver.testbed_shell.GetLeaseGranularity()
             rspec_nodes = []
             for node_id in nodes_dict:
                 node = nodes_dict[node_id]
                 # rspec_node = self.node_to_rspec_node(node, sites, interfaces, node_tags, pl_initscripts)
             rspec_nodes = []
             for node_id in nodes_dict:
                 node = nodes_dict[node_id]
                 # rspec_node = self.node_to_rspec_node(node, sites, interfaces, node_tags, pl_initscripts)
-                rspec_node = self.node_to_rspec_node(node, grain)
+                rspec_node = self.node_to_rspec_node(node)
                 rspec_nodes.append(rspec_node)
             rspec.version.add_nodes(rspec_nodes)
 
                 rspec_nodes.append(rspec_node)
             rspec.version.add_nodes(rspec_nodes)
 
@@ -564,18 +740,45 @@ class IotlabAggregate:
             # links = self.get_links(sites, nodes_dict, interfaces)
             # rspec.version.add_links(links)
 
             # links = self.get_links(sites, nodes_dict, interfaces)
             # rspec.version.add_links(links)
 
-        if not options.get('list_leases') or options.get('list_leases') and options['list_leases'] != 'resources':
-           leases = self.get_all_leases()
-           rspec.version.add_leases(leases)
+        if not options.get('list_leases') or options.get('list_leases') \
+            and options['list_leases'] != 'resources':
+            leases = self.get_all_leases(ldap_username)
+            rspec.version.add_leases(leases)
 
         return rspec.toxml()
 
 
     def describe(self, urns, version=None, options={}):
 
         return rspec.toxml()
 
 
     def describe(self, urns, version=None, options={}):
+        """
+        Retrieve a manifest RSpec describing the resources contained by the
+        named entities, e.g. a single slice or a set of the slivers in a slice.
+        This listing and description should be sufficiently descriptive to allow
+        experimenters to use the resources.
+
+        returns: On success returns the following struct:
+        {
+           geni_rspec: <geni.rspec, a Manifest RSpec>
+           geni_urn: <string slice urn of the containing slice>
+           geni_slivers:{
+                          geni_sliver_urn: <string sliver urn>
+                          geni_expires:  <dateTime.rfc3339
+                          allocation expiration string, as in geni_expires
+                          from SliversStatus>,
+                          geni_allocation_status: <string sliver state -
+                          e.g. geni_allocated or geni_provisioned >,
+                          geni_operational_status: <string sliver operational
+                          state>,
+                          geni_error: <optional string. The field may be omitted
+                           entirely but may not be null/None, explaining any
+                           failure for a sliver.>
+                       },
+                 ]}
+        .. seealso:: http://groups.geni.net/geni/wiki/GAPI_AM_API_V3#Describe
+        """
         version_manager = VersionManager()
         version = version_manager.get_version(version)
         version_manager = VersionManager()
         version = version_manager.get_version(version)
-        rspec_version = version_manager._get_version(version.type,
-                                                     version.version, 'manifest')
+        rspec_version = version_manager._get_version(
+                                    version.type, version.version, 'manifest')
         rspec = RSpec(version=rspec_version, user_options=options)
 
         # get slivers
         rspec = RSpec(version=rspec_version, user_options=options)
 
         # get slivers
@@ -590,8 +793,14 @@ class IotlabAggregate:
         # lookup the sliver allocations
         geni_urn = urns[0]
         sliver_ids = [sliver['sliver_id'] for sliver in slivers]
         # lookup the sliver allocations
         geni_urn = urns[0]
         sliver_ids = [sliver['sliver_id'] for sliver in slivers]
+        logger.debug(" IOTLAB_API.PY \tDescribe  sliver_ids %s "
+                     % (sliver_ids))
         constraint = SliverAllocation.sliver_id.in_(sliver_ids)
         constraint = SliverAllocation.sliver_id.in_(sliver_ids)
-        sliver_allocations = self.driver.api.dbsession().query(SliverAllocation).filter(constraint)
+        logger.debug(" IOTLAB_API.PY \tDescribe  constraint %s "
+                     % (constraint))
+        sliver_allocations = self.driver.api.dbsession().query(SliverAllocation).filter((constraint)).all()
+        logger.debug(" IOTLAB_API.PY \tDescribe  sliver_allocations %s "
+                     % (sliver_allocations))
         sliver_allocation_dict = {}
         for sliver_allocation in sliver_allocations:
             geni_urn = sliver_allocation.slice_urn
         sliver_allocation_dict = {}
         for sliver_allocation in sliver_allocations:
             geni_urn = sliver_allocation.slice_urn
@@ -605,8 +814,14 @@ class IotlabAggregate:
         for sliver in slivers:
             rspec_node = self.sliver_to_rspec_node(sliver, sliver_allocation_dict)
             rspec_nodes.append(rspec_node)
         for sliver in slivers:
             rspec_node = self.sliver_to_rspec_node(sliver, sliver_allocation_dict)
             rspec_nodes.append(rspec_node)
+            logger.debug(" IOTLAB_API.PY \tDescribe  sliver_allocation_dict %s "
+                     % (sliver_allocation_dict))
             geni_sliver = self.rspec_node_to_geni_sliver(rspec_node, sliver_allocation_dict)
             geni_slivers.append(geni_sliver)
             geni_sliver = self.rspec_node_to_geni_sliver(rspec_node, sliver_allocation_dict)
             geni_slivers.append(geni_sliver)
+
+        logger.debug(" IOTLAB_API.PY \tDescribe rspec_nodes %s\
+                        rspec %s "
+                     % (rspec_nodes, rspec))
         rspec.version.add_nodes(rspec_nodes)
 
         return {'geni_urn': geni_urn,
         rspec.version.add_nodes(rspec_nodes)
 
         return {'geni_urn': geni_urn,
index 6aea1ce..699e111 100644 (file)
@@ -4,18 +4,20 @@ Implements what a driver should provide for SFA to work.
 from sfa.util.faults import SliverDoesNotExist, UnknownSfaType
 from sfa.util.sfalogging import logger
 from sfa.storage.model import RegRecord
 from sfa.util.faults import SliverDoesNotExist, UnknownSfaType
 from sfa.util.sfalogging import logger
 from sfa.storage.model import RegRecord
+from sfa.util.sfatime import utcparse, datetime_to_string
 
 from sfa.managers.driver import Driver
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.rspec import RSpec
 
 
 from sfa.managers.driver import Driver
 from sfa.rspecs.version_manager import VersionManager
 from sfa.rspecs.rspec import RSpec
 
-from sfa.util.xrn import Xrn, hrn_to_urn, get_authority
+from sfa.iotlab.iotlabxrn import xrn_object
+from sfa.util.xrn import Xrn, hrn_to_urn, get_authority, urn_to_hrn
 
 from sfa.iotlab.iotlabaggregate import IotlabAggregate
 from sfa.iotlab.iotlabxrn import xrn_to_hostname
 from sfa.iotlab.iotlabslices import IotlabSlices
 
 
 from sfa.iotlab.iotlabaggregate import IotlabAggregate
 from sfa.iotlab.iotlabxrn import xrn_to_hostname
 from sfa.iotlab.iotlabslices import IotlabSlices
 
-
+from sfa.storage.model import SliverAllocation
 from sfa.iotlab.iotlabshell import IotlabShell
 
 
 from sfa.iotlab.iotlabshell import IotlabShell
 
 
@@ -41,7 +43,7 @@ class IotlabDriver(Driver):
         Driver.__init__(self, api)
         self.api = api
         config = api.config
         Driver.__init__(self, api)
         self.api = api
         config = api.config
-        self.testbed_shell = IotlabShell(config)
+        self.testbed_shell = IotlabShell(api)
         self.cache = None
 
     def augment_records_with_testbed_info(self, record_list):
         self.cache = None
 
     def augment_records_with_testbed_info(self, record_list):
@@ -525,17 +527,14 @@ class IotlabDriver(Driver):
                                    login=sfa_slice['login'],
                                    version=rspec.version)
 
                                    login=sfa_slice['login'],
                                    version=rspec.version)
 
-    def delete_sliver(self, slice_urn, slice_hrn, creds, options):
+    def delete(self, slice_urns, options):
         """
         Deletes the lease associated with the slice hrn and the credentials
             if the slice belongs to iotlab. Answer to DeleteSliver.
 
         :param slice_urn: urn of the slice
         """
         Deletes the lease associated with the slice hrn and the credentials
             if the slice belongs to iotlab. Answer to DeleteSliver.
 
         :param slice_urn: urn of the slice
-        :param slice_hrn: name of the slice
-        :param creds: slice credenials
         :type slice_urn: string
         :type slice_urn: string
-        :type slice_hrn: string
-        :type creds: ? unused
+
 
         :returns: 1 if the slice to delete was not found on iotlab,
             True if the deletion was successful, False otherwise otherwise.
 
         :returns: 1 if the slice to delete was not found on iotlab,
             True if the deletion was successful, False otherwise otherwise.
@@ -546,6 +545,20 @@ class IotlabDriver(Driver):
         .. note:: creds are unused, and are not used either in the dummy driver
              delete_sliver .
         """
         .. note:: creds are unused, and are not used either in the dummy driver
              delete_sliver .
         """
+        # collect sliver ids so we can update sliver allocation states after
+        # we remove the slivers.
+        aggregate = IotlabAggregate(self)
+        slivers = aggregate.get_slivers(slice_urns)
+        if slivers:
+            slice_id = slivers[0]['slice_id']
+            node_ids = []
+            sliver_ids = []
+            for sliver in slivers:
+                node_ids.append(sliver['node_id'])
+                sliver_ids.append(sliver['sliver_id'])
+        logger.debug("IOTLABDRIVER.PY delete_sliver slivers %s slice_urns %s"
+            % (slivers, slice_urns))
+        slice_hrn = urn_to_hrn(slice_urns[0])[0]
 
         sfa_slice_list = self.testbed_shell.GetSlices(
             slice_filter=slice_hrn,
 
         sfa_slice_list = self.testbed_shell.GetSlices(
             slice_filter=slice_hrn,
@@ -566,9 +579,19 @@ class IotlabDriver(Driver):
                 \r\n \t sfa_slice %s " % (peer, sfa_slice))
             try:
                 self.testbed_shell.DeleteSliceFromNodes(sfa_slice)
                 \r\n \t sfa_slice %s " % (peer, sfa_slice))
             try:
                 self.testbed_shell.DeleteSliceFromNodes(sfa_slice)
-                return True
+                dbsession = self.api.dbsession()
+                SliverAllocation.delete_allocations(sliver_ids,dbsession)
             except:
             except:
-                return False
+                logger.log_exc("IOTLABDRIVER.PY delete error ")
+
+        # prepare return struct
+        geni_slivers = []
+        for sliver in slivers:
+            geni_slivers.append(
+                {'geni_sliver_urn': sliver['sliver_id'],
+                 'geni_allocation_status': 'geni_unallocated',
+                 'geni_expires': datetime_to_string(utcparse(sliver['expires']))})
+        return geni_slivers
 
     def list_resources (self, slice_urn, slice_hrn, creds, options):
         """
 
     def list_resources (self, slice_urn, slice_hrn, creds, options):
         """
@@ -869,10 +892,12 @@ class IotlabDriver(Driver):
 
         slice_record = None
         users = options.get('geni_users', [])
 
         slice_record = None
         users = options.get('geni_users', [])
-        if users:
-            slice_record = users[0].get('slice_record', {})
-            logger.debug("IOTLABDRIVER.PY \t ===============allocatte \t\
-                            \r\n \r\n users %s" % (users))
+
+        sfa_users = options.get('sfa_users', [])
+        if sfa_users:
+            slice_record = sfa_users[0].get('slice_record', [])
+        logger.debug("IOTLABDRIVER.PY \t ===============allocate \t\
+                            \r\n \r\n options %s slice_record %s" % (options,slice_record))
         # parse rspec
         rspec = RSpec(rspec_string)
         # requested_attributes = rspec.version.get_slice_attributes()
         # parse rspec
         rspec = RSpec(rspec_string)
         # requested_attributes = rspec.version.get_slice_attributes()
@@ -880,30 +905,65 @@ class IotlabDriver(Driver):
         # ensure site record exists
         # site = slices.verify_site(xrn.hrn, slice_record, peer, sfa_peer, options=options)
         # ensure slice record exists
         # ensure site record exists
         # site = slices.verify_site(xrn.hrn, slice_record, peer, sfa_peer, options=options)
         # ensure slice record exists
-        current_slice = slices.verify_slice(xrn.hrn, slice_record, peer, sfa_peer, expiration=expiration, options=options)
+
+        current_slice = slices.verify_slice(xrn.hrn, slice_record, sfa_peer)
+        logger.debug("IOTLABDRIVER.PY \t ===============allocate \t\
+                            \r\n \r\n  current_slice %s" % (current_slice))
         # ensure person records exists
         # ensure person records exists
-        persons = slices.verify_persons(xrn.hrn, slice, users, peer, sfa_peer, options=options)
+
+        # oui c'est degueulasse, le slice_record se retrouve modifie
+        # dans la methode avec les infos du user, els infos sont propagees
+        # dans verify_slice_leases
+        persons = slices.verify_persons(xrn.hrn, slice_record, users, options=options)
         # ensure slice attributes exists
         # slices.verify_slice_attributes(slice, requested_attributes, options=options)
 
         # add/remove slice from nodes
         requested_xp_dict = self._process_requested_xp_dict(rspec)
 
         # ensure slice attributes exists
         # slices.verify_slice_attributes(slice, requested_attributes, options=options)
 
         # add/remove slice from nodes
         requested_xp_dict = self._process_requested_xp_dict(rspec)
 
-        logger.debug("IOTLABDRIVER.PY \tcreate_sliver  requested_xp_dict %s "
+        logger.debug("IOTLABDRIVER.PY \tallocate  requested_xp_dict %s "
                      % (requested_xp_dict))
                      % (requested_xp_dict))
-        # request_nodes = rspec.version.get_nodes_with_slivers()
-        # nodes = slices.verify_slice_nodes(urn, slice, request_nodes, peer)
+        request_nodes = rspec.version.get_nodes_with_slivers()
+        nodes_list = []
+        for start_time in requested_xp_dict:
+            lease = requested_xp_dict[start_time]
+            for hostname in lease['hostname']:
+                nodes_list.append(hostname)
+
+        # nodes = slices.verify_slice_nodes(slice_record,request_nodes, peer)
+        logger.debug("IOTLABDRIVER.PY \tallocate  nodes_list %s slice_record %s"
+                     % (nodes_list, slice_record))
 
 
+        # add/remove leases
+        rspec_requested_leases = rspec.version.get_leases()
+        leases = slices.verify_slice_leases(slice_record, requested_xp_dict, peer)
+        logger.debug("IOTLABDRIVER.PY \tallocate leases  %s rspec_requested_leases %s"
+                     % (leases,rspec_requested_leases))
+         # update sliver allocations
+        for hostname in nodes_list:
+            client_id = hostname
+            node_urn = xrn_object(self.testbed_shell.root_auth, hostname).urn
+            component_id = node_urn
+            slice_urn = current_slice['reg-urn']
+            for lease in leases:
+                if hostname in lease['reserved_nodes']:
+                    index = lease['reserved_nodes'].index(hostname)
+                    sliver_hrn = '%s.%s-%s' % (self.hrn, lease['lease_id'],
+                                   lease['resource_ids'][index] )
+            sliver_id = Xrn(sliver_hrn, type='sliver').urn
+            record = SliverAllocation(sliver_id=sliver_id, client_id=client_id,
+                                      component_id=component_id,
+                                      slice_urn = slice_urn,
+                                      allocation_state='geni_allocated')
+
+            logger.debug("\r\n \
+                ===============================IOTLABDRIVER.PY \tallocate  sliver_id %s slice_urn %s \r\n"
+                     % (sliver_id,slice_urn))
+            record.sync(self.api.dbsession())
         # add/remove links links
         # slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)
 
         # add/remove links links
         # slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)
 
-        # add/remove leases
-        # rspec_requested_leases = rspec.version.get_leases()
-        leases = slices.verify_slice_leases(current_slice, requested_xp_dict, peer)
 
 
-        # handle MyPLC peer association.
-        # only used by plc and ple.
-        slices.handle_peer(site, slice, None, peer)
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
 
         return aggregate.describe([xrn.get_urn()], version=rspec.version)
 
@@ -916,12 +976,12 @@ class IotlabDriver(Driver):
         peer = slices.get_peer(current_slice['hrn'])
         sfa_peer = slices.get_sfa_peer(current_slice['hrn'])
         users = options.get('geni_users', [])
         peer = slices.get_peer(current_slice['hrn'])
         sfa_peer = slices.get_sfa_peer(current_slice['hrn'])
         users = options.get('geni_users', [])
-        persons = slices.verify_persons(current_slice['hrn'],
-            current_slice, users, peer, sfa_peer, options=options)
-        slices.handle_peer(None, None, persons, peer)
+        persons = slices.verify_persons(current_slice['hrn'],
+            current_slice, users, peer, sfa_peer, options=options)
+        slices.handle_peer(None, None, persons, peer)
         # update sliver allocation states and set them to geni_provisioned
         sliver_ids = [sliver['sliver_id'] for sliver in slivers]
         # update sliver allocation states and set them to geni_provisioned
         sliver_ids = [sliver['sliver_id'] for sliver in slivers]
-        dbsession=self.api.dbsession()
+        dbsession =self.api.dbsession()
         SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',dbsession)
         version_manager = VersionManager()
         rspec_version = version_manager.get_version(options['geni_rspec_version'])
         SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',dbsession)
         version_manager = VersionManager()
         rspec_version = version_manager.get_version(options['geni_rspec_version'])
index 453852e..e546943 100644 (file)
@@ -27,7 +27,7 @@ class IotlabShell():
 
     _MINIMUM_DURATION = 10  # 10 units of granularity 60 s, 10 mins
 
 
     _MINIMUM_DURATION = 10  # 10 units of granularity 60 s, 10 mins
 
-    def __init__(self, config):
+    def __init__(self, api):
         """Creates an instance of OARrestapi and LDAPapi which will be used to
         issue calls to OAR or LDAP methods.
         Set the time format  and the testbed granularity used for OAR
         """Creates an instance of OARrestapi and LDAPapi which will be used to
         issue calls to OAR or LDAP methods.
         Set the time format  and the testbed granularity used for OAR
@@ -36,8 +36,8 @@ class IotlabShell():
         :param config: configuration object from sfa.util.config
         :type config: Config object
         """
         :param config: configuration object from sfa.util.config
         :type config: Config object
         """
-        # self.api=api
-        # config=api.config
+        self.api = api
+        config = api.config
         self.leases_db = TestbedAdditionalSfaDB(config)
         self.oar = OARrestapi()
         self.ldap = LDAPapi()
         self.leases_db = TestbedAdditionalSfaDB(config)
         self.oar = OARrestapi()
         self.ldap = LDAPapi()
@@ -814,6 +814,7 @@ class IotlabShell():
         :type slice_record: dict
         :type lease_start_time: integer
         :type lease_duration: integer
         :type slice_record: dict
         :type lease_start_time: integer
         :type lease_duration: integer
+        :returns: job_id, can be None if the job request failed.
 
         """
         logger.debug("IOTLAB_API \r\n \r\n \t AddLeases hostname_list %s  \
 
         """
         logger.debug("IOTLAB_API \r\n \r\n \t AddLeases hostname_list %s  \
@@ -828,31 +829,32 @@ class IotlabShell():
                                     slice_record['hrn'], \
                                     lease_start_time, lease_duration, \
                                     username)
                                     slice_record['hrn'], \
                                     lease_start_time, lease_duration, \
                                     username)
-        start_time = \
-                datetime.fromtimestamp(int(lease_start_time)).\
-                strftime(self.time_format)
-        end_time = lease_start_time + lease_duration
+        if job_id is not None:
+            start_time = \
+                    datetime.fromtimestamp(int(lease_start_time)).\
+                    strftime(self.time_format)
+            end_time = lease_start_time + lease_duration
 
 
 
 
-        logger.debug("IOTLAB_API \r\n \r\n \t AddLeases TURN ON LOGGING SQL \
-                        %s %s %s "%(slice_record['hrn'], job_id, end_time))
+            logger.debug("IOTLAB_API \r\n \r\n \t AddLeases TURN ON LOGGING SQL \
+                            %s %s %s "%(slice_record['hrn'], job_id, end_time))
 
 
 
 
-        logger.debug("IOTLAB_API \r\n \r\n \t AddLeases %s %s %s " \
-                %(type(slice_record['hrn']), type(job_id), type(end_time)))
+            logger.debug("IOTLAB_API \r\n \r\n \t AddLeases %s %s %s " \
+                    %(type(slice_record['hrn']), type(job_id), type(end_time)))
 
 
-        iotlab_ex_row = LeaseTableXP(slice_hrn = slice_record['hrn'], experiment_id=job_id,
-                                 end_time= end_time)
+            iotlab_ex_row = LeaseTableXP(slice_hrn = slice_record['hrn'], experiment_id=job_id,
+                                     end_time= end_time)
 
 
-        logger.debug("IOTLAB_API \r\n \r\n \t AddLeases iotlab_ex_row %s" \
-                %(iotlab_ex_row))
-        self.leases_db.testbed_session.add(iotlab_ex_row)
-        self.leases_db.testbed_session.commit()
+            logger.debug("IOTLAB_API \r\n \r\n \t AddLeases iotlab_ex_row %s" \
+                    %(iotlab_ex_row))
+            self.leases_db.testbed_session.add(iotlab_ex_row)
+            self.leases_db.testbed_session.commit()
 
 
-        logger.debug("IOTLAB_API \t AddLeases hostname_list start_time %s " \
-                %(start_time))
+            logger.debug("IOTLAB_API \t AddLeases hostname_list start_time %s " \
+                    %(start_time))
 
 
-        return
+        return job_id
 
 
     #Delete the jobs from job_iotlab table
 
 
     #Delete the jobs from job_iotlab table
index b7a81e0..6b90c44 100644 (file)
@@ -207,10 +207,15 @@ class IotlabSlices:
                 logger.debug("IOTLABSLICES \
                               NEWLEASE slice %s  job %s"
                              % (sfa_slice, job))
                 logger.debug("IOTLABSLICES \
                               NEWLEASE slice %s  job %s"
                              % (sfa_slice, job))
-                self.driver.testbed_shell.AddLeases(
+                job_id = self.driver.testbed_shell.AddLeases(
                     job['hostname'],
                     sfa_slice, int(job['start_time']),
                     int(job['duration']))
                     job['hostname'],
                     sfa_slice, int(job['start_time']),
                     int(job['duration']))
+                if job_id is not None:
+                    new_leases = self.driver.testbed_shell.GetLeases(login=
+                        sfa_slice['login'])
+                    for new_lease in new_leases:
+                        leases.append(new_lease)
 
         #Deleted leases are the ones with lease id not declared in the Rspec
         if deleted_leases:
 
         #Deleted leases are the ones with lease id not declared in the Rspec
         if deleted_leases:
@@ -378,7 +383,6 @@ class IotlabSlices:
         logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn  %s  \
                     \t slice_record %s\r\n users %s \t  "
                      % (slice_hrn, slice_record, users))
         logger.debug("IOTLABSLICES \tverify_persons \tslice_hrn  %s  \
                     \t slice_record %s\r\n users %s \t  "
                      % (slice_hrn, slice_record, users))
-        users_by_id = {}
 
         users_by_email = {}
         #users_dict : dict whose keys can either be the user's hrn or its id.
 
         users_by_email = {}
         #users_dict : dict whose keys can either be the user's hrn or its id.
@@ -387,19 +391,18 @@ class IotlabSlices:
 
         #First create dicts by hrn and id for each user in the user record list:
         for info in users:
 
         #First create dicts by hrn and id for each user in the user record list:
         for info in users:
-            if 'slice_record' in info:
-                slice_rec = info['slice_record']
-                if 'user' in slice_rec :
-                    user = slice_rec['user']
+            if 'slice_record' in info:
+                slice_rec = info['slice_record']
+                if 'user' in slice_rec :
+                    user = slice_rec['user']
 
 
-                    if 'email' in user:
-                        users_by_email[user['email']] = user
-                        users_dict[user['email']] = user
+            if 'email' in info:
+                users_by_email[info['email']] = info
+                users_dict[info['email']] = info
 
         logger.debug("SLABSLICE.PY \t verify_person  \
 
         logger.debug("SLABSLICE.PY \t verify_person  \
-                        users_dict %s \r\n user_by_email %s \r\n \
-                        \tusers_by_id %s "
-                     % (users_dict, users_by_email, users_by_id))
+                        users_dict %s \r\n user_by_email %s \r\n  "
+                     % (users_dict, users_by_email))
 
         existing_user_ids = []
         existing_user_emails = []
 
         existing_user_ids = []
         existing_user_emails = []
@@ -417,12 +420,13 @@ class IotlabSlices:
             #Needed because what if the user has been deleted in LDAP but
             #is still in SFA?
             existing_users = self.driver.testbed_shell.GetPersons(filter_user)
             #Needed because what if the user has been deleted in LDAP but
             #is still in SFA?
             existing_users = self.driver.testbed_shell.GetPersons(filter_user)
-            logger.debug(" \r\n IOTLABSLICES.PY \tverify_person  filter_user \
-                        %s existing_users %s "
+            logger.debug(" \r\n IOTLABSLICES.PY \tverify_person  filter_user %s\
+                       existing_users %s  "
                         % (filter_user, existing_users))
             #User is in iotlab LDAP
             if existing_users:
                 for user in existing_users:
                         % (filter_user, existing_users))
             #User is in iotlab LDAP
             if existing_users:
                 for user in existing_users:
+                    user['login'] = user['uid']
                     users_dict[user['email']].update(user)
                     existing_user_emails.append(
                         users_dict[user['email']]['email'])
                     users_dict[user['email']].update(user)
                     existing_user_emails.append(
                         users_dict[user['email']]['email'])
@@ -459,7 +463,7 @@ class IotlabSlices:
         #Check that the user of the slice in the slice record
         #matches one of the existing users
         try:
         #Check that the user of the slice in the slice record
         #matches one of the existing users
         try:
-            if slice_record['PI'][0] in requested_user_hrns:
+            if slice_record['reg-researchers'][0] in requested_user_hrns:
                 logger.debug(" SLABSLICE  \tverify_person ['PI']\
                                 slice_record %s" % (slice_record))
 
                 logger.debug(" SLABSLICE  \tverify_person ['PI']\
                                 slice_record %s" % (slice_record))
 
index 5d84249..c7a147c 100644 (file)
@@ -46,8 +46,8 @@ def hrn_to_iotlab_authname (hrn):
 class IotlabXrn (Xrn):
 
     @staticmethod
 class IotlabXrn (Xrn):
 
     @staticmethod
-    def site_hrn (auth, testbed_name):
-        return '.'.join([auth, testbed_name])
+    def site_hrn (auth):
+        return auth
 
     def __init__ (self, auth=None, hostname=None, login=None, slicename=None,**kwargs):
         #def hostname_to_hrn(auth_hrn, login_base, hostname):
 
     def __init__ (self, auth=None, hostname=None, login=None, slicename=None,**kwargs):
         #def hostname_to_hrn(auth_hrn, login_base, hostname):
@@ -70,8 +70,6 @@ class IotlabXrn (Xrn):
             self.hrn_to_urn()
             # split at the first _
 
             self.hrn_to_urn()
             # split at the first _
 
-
-
         else:
             Xrn.__init__ (self,**kwargs)
 
         else:
             Xrn.__init__ (self,**kwargs)
 
index 8d3722d..af6fe2a 100644 (file)
@@ -58,7 +58,7 @@ class Iotlabv1Node:
             network_elem.set('login', unicode(iotlab_network_dict['login']))
 
     @staticmethod
             network_elem.set('login', unicode(iotlab_network_dict['login']))
 
     @staticmethod
-    def add_nodes(xml, nodes):
+    def add_nodes(xml, nodes,rspec_content_type=None):
         """Adds the nodes to the xml.
 
         Adds the nodes as well as dedicated iotlab fields to the node xml
         """Adds the nodes to the xml.
 
         Adds the nodes as well as dedicated iotlab fields to the node xml
@@ -154,6 +154,9 @@ class Iotlabv1Node:
                                                     #'value': initscript['name']})
 
                     Iotlabv1Sliver.add_slivers(node_elem, slivers)
                                                     #'value': initscript['name']})
 
                     Iotlabv1Sliver.add_slivers(node_elem, slivers)
+                # add sliver tag in Request Rspec
+            if rspec_content_type == "request":
+                node_elem.add_instance('sliver', '', [])
         return node_elems
 
     @staticmethod
         return node_elems
 
     @staticmethod
index c22b9e8..d6f6015 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version="1.0"?>
 <RSpec type="SFA" expires="2013-02-27T15:14:10Z" generated="2013-02-27T14:14:10Z">
   <network name="iotlab">
 <?xml version="1.0"?>
 <RSpec type="SFA" expires="2013-02-27T15:14:10Z" generated="2013-02-27T14:14:10Z">
   <network name="iotlab">
-    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+wsn430-8.devlille.iot-lab.info" boot_state="Alive" component_name="wsn430-8.devlille.iot-lab.info.info" site_id="urn:publicid:IDN+senslab+authority+sa">
+    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+wsn430-8.devlille.iot-lab.info" boot_state="Alive" component_name="wsn430-8.devlille.iot-lab.info.info" site_id="urn:publicid:IDN+iotlab+authority+sa">
       <hostname>wsn430-8.devlille.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
       <granularity grain="600"/>
       <sliver/>
     </node>
       <hostname>wsn430-8.devlille.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
       <granularity grain="600"/>
       <sliver/>
     </node>
-    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+wsn430-5.devlille.iot-lab.info" boot_state="Alive" component_name="wsn430-5.devlille.iot-lab.info" site_id="urn:publicid:IDN+senslab+authority+sa">
+    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+wsn430-5.devlille.iot-lab.info" boot_state="Alive" component_name="wsn430-5.devlille.iot-lab.info" site_id="urn:publicid:IDN+iotlab+authority+sa">
       <hostname>wsn430-5.devlille.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
       <hostname>wsn430-5.devlille.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
index 6a283f3..ff78079 100644 (file)
@@ -1,14 +1,14 @@
 <?xml version="1.0"?>
 <RSpec type="SFA" expires="2013-02-27T15:14:10Z" generated="2013-02-27T14:14:10Z">
   <network name="iotlab">
 <?xml version="1.0"?>
 <RSpec type="SFA" expires="2013-02-27T15:14:10Z" generated="2013-02-27T14:14:10Z">
   <network name="iotlab">
-    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+wsn430-12.devlille.iot-lab.info" boot_state="Alive" component_name="wsn430-12.devlille.iot-lab.info" site_id="urn:publicid:IDN+senslab+authority+sa">
+    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+wsn430-12.devlille.iot-lab.info" boot_state="Alive" component_name="wsn430-12.devlille.iot-lab.info" site_id="urn:publicid:IDN+iotlab+authority+sa">
       <hostname>wsn430-12.devlille.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
       <granularity grain="600"/>
       <sliver/>
     </node>
       <hostname>wsn430-12.devlille.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
       <granularity grain="600"/>
       <sliver/>
     </node>
-    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+a8-11.devgrenoble.iot-lab.info" boot_state="Alive" component_name="a8-11.devgrenoble.iot-lab.info" site_id="urn:publicid:IDN+senslab+authority+sa">
+    <node component_manager_id="urn:publicid:IDN+iotlab+authority+sa" component_id="urn:publicid:IDN+iotlab+node+a8-11.devgrenoble.iot-lab.info" boot_state="Alive" component_name="a8-11.devgrenoble.iot-lab.info" site_id="urn:publicid:IDN+iotlab+authority+sa">
       <hostname>"a8-11.devgrenoble.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>
       <hostname>"a8-11.devgrenoble.iot-lab.info</hostname>
       <location country="France"/>
       <exclusive>TRUE</exclusive>