Esempio n. 1
0
    def get_slice_and_slivers(self, slice_xrn, login=None):
        """
        Returns a dict of slivers keyed on the sliver's node_id
        """
        slivers = {}
        sfa_slice = None
        if not slice_xrn:
            return (sfa_slice, slivers)
        slice_urn = hrn_to_urn(slice_xrn, 'slice')
        slice_hrn, _ = urn_to_hrn(slice_xrn)
        slice_name = slice_hrn

        slices = self.driver.GetSlices(slice_filter= str(slice_name), \
                                                slice_filter_type = 'slice_hrn', login=login)
        
        logger.debug("Slabaggregate api \tget_slice_and_slivers \
                        sfa_slice %s \r\n slices %s self.driver.hrn %s" \
                        %(sfa_slice, slices, self.driver.hrn))
        if not slices:
            return (sfa_slice, slivers)
        #if isinstance(sfa_slice, list):
            #sfa_slice = slices[0]
        #else:
            #sfa_slice = slices

        # sort slivers by node id , if there is a job
        #and therfore, node allocated to this slice
        for sfa_slice in slices:
            try:
                node_ids_list =  sfa_slice['node_ids']  
            except KeyError:
                logger.log_exc("SLABAGGREGATE \t \
                                        get_slice_and_slivers KeyError ")
                continue
                                        
            for node in node_ids_list:
                sliver_xrn = Xrn(slice_urn, type='sliver', id=node)
                sliver_xrn.set_authority(self.driver.hrn)
                #node_id = self.driver.root_auth + '.' + node_id
                sliver = Sliver({'sliver_id':sliver_xrn.urn, 
                                'name': sfa_slice['hrn'],
                                'type': 'slab-node', 
                                'tags': []})
                
                slivers[node] = sliver
          
        
        #Add default sliver attribute :
        #connection information for senslab
        if get_authority (sfa_slice['hrn']) == self.driver.root_auth: 
            tmp = sfa_slice['hrn'].split('.')
            ldap_username = tmp[1].split('_')[0]
            vmaddr = 'ssh ' + ldap_username + '@grenoble.senslab.info'
            slivers['default_sliver'] =  {'vm': vmaddr , 'login': ldap_username}
            
        #TODO get_slice_and_slivers Find the login of the external user

        logger.debug("SLABAGGREGATE api get_slice_and_slivers  slivers %s "\
                                                             %(slivers))
        return (slices, slivers)
Esempio n. 2
0
    def get_slice_and_slivers(self, slice_xrn):
        """
        Returns a dict of slivers keyed on the sliver's node_id
        """
        slivers = {}
        slice = None
        if not slice_xrn:
            return (slice, slivers)
        slice_urn = hrn_to_urn(slice_xrn, 'slice')
        slice_hrn, _ = urn_to_hrn(slice_xrn)
        slice_name = hrn_to_pl_slicename(slice_hrn)
        slices = self.driver.shell.GetSlices(slice_name)
        if not slices:
            return (slice, slivers)
        slice = slices[0]

        # sort slivers by node id    
        for node_id in slice['node_ids']:
            sliver_xrn = Xrn(slice_urn, type='sliver', id=node_id)
            sliver_xrn.set_authority(self.driver.hrn)
            sliver = Sliver({'sliver_id': sliver_xrn.urn,
                             'name': slice['name'],
                             'type': 'plab-vserver', 
                             'tags': []})
            slivers[node_id]= sliver

        # sort sliver attributes by node id    
        tags = self.driver.shell.GetSliceTags({'slice_tag_id': slice['slice_tag_ids']})
        for tag in tags:
            # most likely a default/global sliver attribute (node_id == None)
            if tag['node_id'] not in slivers:
                sliver_xrn = Xrn(slice_urn, type='sliver', id=tag['node_id'])
                sliver_xrn.set_authority(self.driver.hrn)
                sliver = Sliver({'sliver_id': sliver_xrn.urn,
                                 'name': slice['name'],
                                 'type': 'plab-vserver',
                                 'tags': []})
                slivers[tag['node_id']] = sliver
            slivers[tag['node_id']]['tags'].append(tag)
        
        return (slice, slivers)
Esempio n. 3
0
    def sliver_status (self, slice_urn, slice_hrn):
        # find out where this slice is currently running
        slicename = hrn_to_pl_slicename(slice_hrn)
        
        slices = self.shell.GetSlices([slicename], ['slice_id', 'node_ids','person_ids','name','expires'])
        if len(slices) == 0:        
            raise SliverDoesNotExist("%s (used %s as slicename internally)" % (slice_hrn, slicename))
        slice = slices[0]
        
        # report about the local nodes only
        nodes = self.shell.GetNodes({'node_id':slice['node_ids'],'peer_id':None},
                              ['node_id', 'hostname', 'site_id', 'boot_state', 'last_contact'])

        if len(nodes) == 0:
            raise SliverDoesNotExist("You have not allocated any slivers here") 

        # get login info
        user = {}
        if slice['person_ids']:
            persons = self.shell.GetPersons(slice['person_ids'], ['key_ids'])
            key_ids = [key_id for person in persons for key_id in person['key_ids']]
            person_keys = self.shell.GetKeys(key_ids)
            keys = [key['key'] for key in person_keys]

            user.update({'urn': slice_urn,
                         'login': slice['name'],
                         'protocol': ['ssh'],
                         'port': ['22'],
                         'keys': keys})

        site_ids = [node['site_id'] for node in nodes]
    
        result = {}
        top_level_status = 'unknown'
        if nodes:
            top_level_status = 'ready'
        result['geni_urn'] = slice_urn
        result['pl_login'] = slice['name']
        result['pl_expires'] = datetime_to_string(utcparse(slice['expires']))
        result['geni_expires'] = datetime_to_string(utcparse(slice['expires']))
        
        resources = []
        for node in nodes:
            res = {}
            res['pl_hostname'] = node['hostname']
            res['pl_boot_state'] = node['boot_state']
            res['pl_last_contact'] = node['last_contact']
            res['geni_expires'] = datetime_to_string(utcparse(slice['expires']))
            if node['last_contact'] is not None:
                
                res['pl_last_contact'] = datetime_to_string(utcparse(node['last_contact']))
            sliver_xrn = Xrn(slice_urn, type='sliver', id=node['node_id'])
            sliver_xrn.set_authority(self.hrn)
             
            res['geni_urn'] = sliver_xrn.urn
            if node['boot_state'] == 'boot':
                res['geni_status'] = 'ready'
            else:
                res['geni_status'] = 'failed'
                top_level_status = 'failed' 
                
            res['geni_error'] = ''
            res['users'] = [user]  
    
            resources.append(res)
            
        result['geni_status'] = top_level_status
        result['geni_resources'] = resources
        return result
Esempio n. 4
0
    def get_slice_and_slivers(self, slice_xrn, login=None):
        """
        Get the slices and the associated leases if any, from the cortexlab
            testbed. One slice can have mutliple leases.
            For each slice, get the nodes in the  associated lease
            and create a sliver with the necessary info and insert it into the
            sliver dictionary, keyed on the node hostnames.
            Returns a dict of slivers based on the sliver's node_id.
            Called by get_rspec.


        :param slice_xrn: xrn of the slice
        :param login: user's login on cortexlab ldap

        :type slice_xrn: string
        :type login: string
        :returns: a list of slices dict and a list of Sliver object
        :rtype: (list, list)

        .. note: There is no real slivers in cortexlab, only leases. The goal
            is to be consistent with the SFA standard.

        """

        slivers = {}
        sfa_slice = None
        if slice_xrn is None:
            return (sfa_slice, slivers)
        slice_urn = hrn_to_urn(slice_xrn, 'slice')
        slice_hrn, _ = urn_to_hrn(slice_xrn)

        # GetSlices always returns a list, even if there is only one element
        slices = self.driver.GetSlices(slice_filter=str(slice_hrn),
                                       slice_filter_type='slice_hrn',
                                       login=login)

        logger.debug("CortexlabAggregate api \tget_slice_and_slivers \
                      slice_hrn %s \r\n slices %s self.driver.hrn %s" %
                     (slice_hrn, slices, self.driver.hrn))
        if slices == []:
            return (sfa_slice, slivers)

        # sort slivers by node id , if there is a job
        #and therefore, node allocated to this slice
        # for sfa_slice in slices:
        sfa_slice = slices[0]
        try:
            node_ids_list = sfa_slice['node_ids']
        except KeyError:
            logger.log_exc("CORTEXLABAGGREGATE \t \
                        get_slice_and_slivers No nodes in the slice \
                        - KeyError ")
            node_ids_list = []
            # continue

        for node in node_ids_list:
            sliver_xrn = Xrn(slice_urn, type='sliver', id=node)
            sliver_xrn.set_authority(self.driver.hrn)
            sliver = Sliver({
                'sliver_id': sliver_xrn.urn,
                'name': sfa_slice['hrn'],
                'type': 'cortexlab-node',
                'tags': []
            })

            slivers[node] = sliver

        #Add default sliver attribute :
        #connection information for cortexlab, assuming it is the same ssh
        # connection process
        # look in ldap:
        ldap_username = self.find_ldap_username_from_slice(sfa_slice)

        if ldap_username is not None:
            ssh_access = None
            slivers['default_sliver'] = {
                'ssh': ssh_access,
                'login': ldap_username
            }

        logger.debug(
            "CORTEXLABAGGREGATE api get_slice_and_slivers  slivers %s " %
            (slivers))
        return (slices, slivers)
Esempio n. 5
0
    def get_slice_and_slivers(self, slice_xrn, login=None):
        """
        Get the slices and the associated leases if any from the iotlab
            testbed. One slice can have mutliple leases.
            For each slice, get the nodes in the  associated lease
            and create a sliver with the necessary info and insert it into the
            sliver dictionary, keyed on the node hostnames.
            Returns a dict of slivers based on the sliver's node_id.
            Called by get_rspec.


        :param slice_xrn: xrn of the slice
        :param login: user's login on iotlab ldap

        :type slice_xrn: string
        :type login: string
        :returns: a list of slices dict and a list of Sliver object
        :rtype: (list, list)

        .. note: There is no real slivers in iotlab, only leases. The goal
            is to be consistent with the SFA standard.

        """
        slivers = {}
        sfa_slice = None
        if slice_xrn is None:
            return (sfa_slice, slivers)
        slice_urn = hrn_to_urn(slice_xrn, 'slice')
        slice_hrn, _ = urn_to_hrn(slice_xrn)

        # GetSlices always returns a list, even if there is only one element
        slices = self.driver.GetSlices(slice_filter=str(slice_hrn),
                                        slice_filter_type='slice_hrn',
                                        login=login)

        logger.debug("IotlabAggregate api \tget_slice_and_slivers \
                      slice_hrn %s \r\n slices %s self.driver.hrn %s"
                     % (slice_hrn, slices, self.driver.hrn))
        if slices == []:
            return (sfa_slice, slivers)

        # sort slivers by node id , if there is a job
        #and therefore, node allocated to this slice
        # for sfa_slice in slices:
        sfa_slice = slices[0]
        try:
            node_ids_list = sfa_slice['node_ids']
        except KeyError:
            logger.log_exc("IOTLABAGGREGATE \t \
                        get_slice_and_slivers No nodes in the slice \
                        - KeyError ")
            node_ids_list = []
            # continue

        for node in node_ids_list:
            sliver_xrn = Xrn(slice_urn, type='sliver', id=node)
            sliver_xrn.set_authority(self.driver.hrn)
            sliver = Sliver({'sliver_id': sliver_xrn.urn,
                            'name': sfa_slice['hrn'],
                            'type': 'iotlab-node',
                            'tags': []})

            slivers[node] = sliver

        #Add default sliver attribute :
        #connection information for iotlab
        # if get_authority(sfa_slice['hrn']) == \
            # self.driver.testbed_shell.root_auth:
        #     tmp = sfa_slice['hrn'].split('.')
        #     ldap_username = tmp[1].split('_')[0]
        #     ssh_access = None
        #     slivers['default_sliver'] = {'ssh': ssh_access,
        #                                  'login': ldap_username}
        # look in ldap:
        ldap_username = self.find_ldap_username_from_slice(sfa_slice)

        if ldap_username is not None:
            ssh_access = None
            slivers['default_sliver'] = {'ssh': ssh_access,
                                             'login': ldap_username}


        logger.debug("IOTLABAGGREGATE api get_slice_and_slivers  slivers %s "
                     % (slivers))
        return (slices, slivers)