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)
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)
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
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)
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)