def _get_experiment(cls, rspec): """ Find in RSpec leases the experiment start time, duration and nodes list. :Example: <rspec> ... <lease slice_id="urn:publicid:IDN+onelab:inria+slice+test_iotlab" start_time="1427792400" duration="30"> <node component_id= "urn:publicid:IDN+iotlab+node+m3-10.grenoble.iot-lab.info"/> </lease> <lease slice_id="urn:publicid:IDN+onelab:inria+slice+test_iotlab" start_time="1427792600" duration="50"> <node component_id= "urn:publicid:IDN+iotlab+node+m3-15.grenoble.iot-lab.info"/> </lease> ... </rspec> """ leases = rspec.version.get_leases() start_time = min([int(lease['start_time']) for lease in leases]) end_time = max([int(lease['start_time']) + int(lease['duration'])*60 for lease in leases]) nodes_list = [Xrn.unescape(Xrn(lease['component_id'].strip(), type='node').get_leaf()) for lease in leases] # uniq hostnames nodes_list = list(set(nodes_list)) from math import floor duration = floor((end_time - start_time)/60) # minutes return nodes_list, start_time, duration
def add_nodes(xml, nodes, rspec_content_type=None): node_elems = [] for node in nodes: node_fields = ['component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive'] node_elem = xml.add_instance('node', node, node_fields) node_elems.append(node_elem) # set component name if node.get('component_id'): component_name = Xrn.unescape(get_leaf(Xrn(node['component_id']).get_hrn())) node_elem.set('component_name', component_name) # set hardware types if node.get('hardware_types'): for hardware_type in node.get('hardware_types', []): 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) # set granularity if node.get('exclusive') == "true": granularity = node.get('granularity') node_elem.add_instance('granularity', granularity, granularity.fields) # set interfaces PGv2Interface.add_interfaces(node_elem, node.get('interfaces')) #if node.get('interfaces'): # for interface in node.get('interfaces', []): # node_elem.add_instance('interface', interface, ['component_id', 'client_id']) # set available element if node.get('available'): available_elem = node_elem.add_element('available', now=node['available']) # add services PGv2Services.add_services(node_elem, node.get('services', [])) # add slivers slivers = node.get('slivers', []) if not slivers: # we must still advertise the available sliver types if node.get('sliver_type'): slivers = Sliver({'type': node['sliver_type']}) else: # Planet lab slivers = Sliver({'type': 'plab-vserver'}) # we must also advertise the available initscripts slivers['tags'] = [] if node.get('pl_initscripts'): for initscript in node.get('pl_initscripts', []): slivers['tags'].append({'name': 'initscript', 'value': initscript['name']}) PGv2SliverType.add_slivers(node_elem, slivers) # advertise the node tags tags = node.get('tags', []) if tags: for tag in tags: tag['name'] = tag.pop('tagname') node_elem.add_instance('{%s}attribute' % xml.namespaces['planetlab'], tag, ['name', 'value']) # add sliver tag in Request Rspec #if rspec_content_type == "request": # node_elem.add_instance('sliver', '', []) return node_elems
def xrn_to_hostname(xrn): """Returns a node's hostname from its xrn. :param xrn: The nodes xrn identifier. :type xrn: Xrn (from sfa.util.xrn) :returns: node's hostname. :rtype: string """ return Xrn.unescape(Xrn(xrn=xrn, type='node').get_leaf())
def xrn_to_hostname(xrn): """ Returns a node's hostname from its xrn NOTE: If it is a URN, it must include the 'type' field :param xrn: The nodes xrn identifier :type Xrn (from sfa.util.xrn) :returns: node's hostname :rtype: string """ unescaped_hostname = unescape_testbed_obj_names(Xrn(xrn=xrn, type='node').get_leaf()) return Xrn.unescape(unescaped_hostname)
def xrn_to_hostname(hrn): return Xrn.unescape(PlXrn(xrn=hrn, type='node').get_leaf())
def private_key_filename (self): return self.fullpath ("%s.pkey" % Xrn.unescape(self.hrn))
def add_nodes(xml, nodes, rspec_content_type=None): network_elems = xml.xpath('//network') if len(network_elems) > 0: network_elem = network_elems[0] elif len(nodes) > 0 and nodes[0].get('component_manager_id'): network_urn = nodes[0]['component_manager_id'] network_elem = xml.add_element('network', name = Xrn(network_urn).get_hrn()) else: network_elem = xml node_elems = [] for node in nodes: node_fields = ['component_manager_id', 'component_id', 'boot_state'] node_elem = network_elem.add_instance('node', node, node_fields) node_elems.append(node_elem) # determine network hrn network_hrn = None if 'component_manager_id' in node and node['component_manager_id']: network_hrn = Xrn(node['component_manager_id']).get_hrn() # set component_name attribute and hostname element if 'component_id' in node and node['component_id']: component_name = Xrn.unescape(get_leaf(Xrn(node['component_id']).get_hrn())) node_elem.set('component_name', component_name) hostname_elem = node_elem.add_element('hostname') hostname_elem.set_text(component_name) # set site id if 'authority_id' in node and node['authority_id']: node_elem.set('site_id', node['authority_id']) # add locaiton location = node.get('location') if location: node_elem.add_instance('location', location, Location.fields) # add exclusive tag to distinguish between Reservable and Shared nodes exclusive_elem = node_elem.add_element('exclusive') if node.get('exclusive') and node.get('exclusive') == 'true': exclusive_elem.set_text('TRUE') # add granularity of the reservation system granularity = node.get('granularity') if granularity: node_elem.add_instance('granularity', granularity, granularity.fields) else: exclusive_elem.set_text('FALSE') if isinstance(node.get('interfaces'), list): for interface in node.get('interfaces', []): node_elem.add_instance('interface', interface, ['component_id', 'client_id', 'ipv4']) #if 'bw_unallocated' in node and node['bw_unallocated']: # bw_unallocated = etree.SubElement(node_elem, 'bw_unallocated', units='kbps').text = str(int(node['bw_unallocated'])/1000) PGv2Services.add_services(node_elem, node.get('services', [])) tags = node.get('tags', []) if tags: for tag in tags: # backdoor for FITeagle # Alexander Willner <*****@*****.**> if tag['tagname']=="fiteagle_settings": tag_elem = node_elem.add_element(tag['tagname']) for subtag in tag['value']: subtag_elem = tag_elem.add_element('setting') subtag_elem.set('name', str(subtag['tagname'])) subtag_elem.set('description', str(subtag['description'])) subtag_elem.set_text(subtag['value']) else: tag_elem = node_elem.add_element(tag['tagname']) tag_elem.set_text(tag['value']) SFAv1Sliver.add_slivers(node_elem, node.get('slivers', [])) # add sliver tag in Request Rspec if rspec_content_type == "request": node_elem.add_instance('sliver', '', [])
def main(): process_options() config = Config() if not config.SFA_REGISTRY_ENABLED: sys.exit(0) root_auth = config.SFA_REGISTRY_ROOT_AUTH interface_hrn = config.SFA_INTERFACE_HRN keys_filename = config.config_path + os.sep + 'person_keys.py' sfaImporter = sfaImport() if config.SFA_API_DEBUG: sfaImporter.logger.setLevelDebug() shell = sfaImporter.shell plc_auth = sfaImporter.plc_auth # initialize registry db table table = SfaTable() if not table.exists(): table.create() # create root authority sfaImporter.create_top_level_auth_records(root_auth) if not root_auth == interface_hrn: sfaImporter.create_top_level_auth_records(interface_hrn) # create s user record for the slice manager sfaImporter.create_sm_client_record() # create interface records sfaImporter.logger.info("Import: creating interface records") sfaImporter.create_interface_records() # add local root authority's cert to trusted list sfaImporter.logger.info("Import: adding " + interface_hrn + " to trusted list") authority = sfaImporter.AuthHierarchy.get_auth_info(interface_hrn) sfaImporter.TrustedRoots.add_gid(authority.get_gid_object()) # special case for vini if ".vini" in interface_hrn and interface_hrn.endswith('vini'): # create a fake internet2 site first i2site = {'name': 'Internet2', 'abbreviated_name': 'I2', 'login_base': 'internet2', 'site_id': -1} sfaImporter.import_site(interface_hrn, i2site) # create dict of all existing sfa records existing_records = {} existing_hrns = [] key_ids = [] person_keys = {} results = table.find() for result in results: existing_records[(result['hrn'], result['type'])] = result existing_hrns.append(result['hrn']) # Get all plc sites sites = shell.GetSites(plc_auth, {'peer_id': None}) sites_dict = {} for site in sites: sites_dict[site['login_base']] = site # Get all plc users persons = shell.GetPersons(plc_auth, {'peer_id': None, 'enabled': True}, ['person_id', 'email', 'key_ids', 'site_ids']) persons_dict = {} for person in persons: persons_dict[person['person_id']] = person key_ids.extend(person['key_ids']) # Get all public keys keys = shell.GetKeys(plc_auth, {'peer_id': None, 'key_id': key_ids}) keys_dict = {} for key in keys: keys_dict[key['key_id']] = key['key'] # create a dict of person keys keyed on key_id old_person_keys = load_keys(keys_filename) for person in persons: pubkeys = [] for key_id in person['key_ids']: pubkeys.append(keys_dict[key_id]) person_keys[person['person_id']] = pubkeys # Get all plc nodes nodes = shell.GetNodes(plc_auth, {'peer_id': None}, ['node_id', 'hostname', 'site_id']) nodes_dict = {} for node in nodes: nodes_dict[node['node_id']] = node # Get all plc slices slices = shell.GetSlices(plc_auth, {'peer_id': None}, ['slice_id', 'name']) slices_dict = {} for slice in slices: slices_dict[slice['slice_id']] = slice # start importing for site in sites: site_hrn = _get_site_hrn(interface_hrn, site) sfaImporter.logger.info("Importing site: %s" % site_hrn) # import if hrn is not in list of existing hrns or if the hrn exists # but its not a site record if site_hrn not in existing_hrns or \ (site_hrn, 'authority') not in existing_records: sfaImporter.import_site(site_hrn, site) # import node records for node_id in site['node_ids']: if node_id not in nodes_dict: continue node = nodes_dict[node_id] site_auth = get_authority(site_hrn) site_name = get_leaf(site_hrn) hrn = hostname_to_hrn(site_auth, site_name, node['hostname']) if hrn not in existing_hrns or \ (hrn, 'node') not in existing_records: sfaImporter.import_node(hrn, node) # import slices for slice_id in site['slice_ids']: if slice_id not in slices_dict: continue slice = slices_dict[slice_id] hrn = slicename_to_hrn(interface_hrn, slice['name']) if hrn not in existing_hrns or \ (hrn, 'slice') not in existing_records: sfaImporter.import_slice(site_hrn, slice) # import persons for person_id in site['person_ids']: if person_id not in persons_dict: continue person = persons_dict[person_id] hrn = email_to_hrn(site_hrn, person['email']) old_keys = [] new_keys = [] if person_id in old_person_keys: old_keys = old_person_keys[person_id] if person_id in person_keys: new_keys = person_keys[person_id] update_record = False for key in new_keys: if key not in old_keys: update_record = True if hrn not in existing_hrns or \ (hrn, 'user') not in existing_records or update_record: sfaImporter.import_person(site_hrn, person) # remove stale records system_records = [interface_hrn, root_auth, interface_hrn + '.slicemanager'] for (record_hrn, type) in existing_records.keys(): if record_hrn in system_records: continue record = existing_records[(record_hrn, type)] if record['peer_authority']: continue # dont delete vini's internet2 placeholdder record # normally this would be deleted becuase it does not have a plc record if ".vini" in interface_hrn and interface_hrn.endswith('vini') and \ record_hrn.endswith("internet2"): continue found = False if type == 'authority': for site in sites: site_hrn = interface_hrn + "." + site['login_base'] if site_hrn == record_hrn and site['site_id'] == record['pointer']: found = True break elif type == 'user': login_base = get_leaf(get_authority(record_hrn)) username = get_leaf(record_hrn) if login_base in sites_dict: site = sites_dict[login_base] for person in persons: tmp_username = person['email'].split("@")[0] alt_username = person['email'].split("@")[0].replace(".", "_").replace("+", "_") if username in [tmp_username, alt_username] and \ site['site_id'] in person['site_ids'] and \ person['person_id'] == record['pointer']: found = True break elif type == 'slice': slicename = hrn_to_pl_slicename(record_hrn) for slice in slices: if slicename == slice['name'] and \ slice['slice_id'] == record['pointer']: found = True break elif type == 'node': login_base = get_leaf(get_authority(record_hrn)) nodename = Xrn.unescape(get_leaf(record_hrn)) if login_base in sites_dict: site = sites_dict[login_base] for node in nodes: tmp_nodename = node['hostname'] if tmp_nodename == nodename and \ node['site_id'] == site['site_id'] and \ node['node_id'] == record['pointer']: found = True break else: continue if not found: record_object = existing_records[(record_hrn, type)] sfaImporter.delete_record(record_hrn, type) # save pub keys sfaImporter.logger.info('Import: saving current pub keys') save_keys(keys_filename, person_keys)
def slab_xrn_to_hostname(xrn): return Xrn.unescape(Xrn(xrn=xrn, type='node').get_leaf())
def xrn_to_channel(hrn): return Xrn.unescape(NitosXrn(xrn=hrn, type='channel').get_leaf())
def add_nodes(xml, nodes, rspec_content_type=None): node_elems = [] for node in nodes: node_fields = [ 'component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive' ] node_elem = xml.add_instance('node', node, node_fields) node_elems.append(node_elem) # set component name if node.get('component_id'): component_name = Xrn.unescape( get_leaf(Xrn(node['component_id']).get_hrn())) node_elem.set('component_name', component_name) # set hardware types if node.get('hardware_types'): for hardware_type in node.get('hardware_types', []): 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) # set granularity if node.get('exclusive') == "true": granularity = node.get('granularity') node_elem.add_instance('granularity', granularity, granularity.fields) # set interfaces Clabv1Interface.add_interfaces(node_elem, node.get('nodeInterfaces')) # set available element if node.get('available'): available_elem = node_elem.add_element('available', now=node['available']) # add services PGv2Services.add_services(node_elem, node.get('services', [])) # add slivers slivers = node.get('slivers', []) if not slivers: # we must still advertise the available sliver types if node.get('sliver_type'): sliver_elem = node_elem.add_element('sliver_type') sliver_elem.set('name', node['sliver_type']) else: # Add the slivers of the node Clabv1Sliver.add_slivers(node_elem, slivers) # EXTENSION for C-Lab v1 RSpec Nodes # Add group group = node.get('group') if group: group_elem = node_elem.add_element('{%s}group' % xml.namespaces['clab'], name=group['name'], id=group['id']) island = node.get('island') if island: island_elem = node_elem.add_element('{%s}island' % xml.namespaces['clab'], name=island['name'], id=island['id']) # Add Node Network Interfaces #node_ifaces = node.get('nodeInterfaces') #if node_ifaces: # node_ifaces_elem = node_elem.add_element('node_interfaces') # for node_iface in node_ifaces: # node_ifaces_elem.add_element('node_interface', name=node_iface['name'], type=node_iface['type']) # Add Management Network Information mgmt_net = node.get('mgmt_net') if mgmt_net: mgmt_net_elem = node_elem.add_element( '{%s}management_network' % xml.namespaces['clab'], addr=mgmt_net['addr']) return node_elems
def add_nodes(xml, nodes, rspec_content_type=None): node_elems = [] for node in nodes: node_fields = [ 'component_manager_id', 'component_id', 'client_id', 'sliver_id', 'exclusive' ] node_elem = xml.add_instance('node', node, node_fields) node_elems.append(node_elem) # set component name if node.get('component_id'): component_name = Xrn.unescape( get_leaf(Xrn(node['component_id']).get_hrn())) node_elem.set('component_name', component_name) # set hardware types if node.get('hardware_types'): for hardware_type in node.get('hardware_types', []): 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) # set granularity if node.get('exclusive') == "true": granularity = node.get('granularity') node_elem.add_instance('granularity', granularity, granularity.fields) # set interfaces PGv2Interface.add_interfaces(node_elem, node.get('interfaces')) #if node.get('interfaces'): # for interface in node.get('interfaces', []): # node_elem.add_instance('interface', interface, ['component_id', 'client_id']) # set available element if node.get('available'): available_elem = node_elem.add_element('available', now=node['available']) # add services PGv2Services.add_services(node_elem, node.get('services', [])) # add slivers slivers = node.get('slivers', []) if not slivers: # we must still advertise the available sliver types if node.get('sliver_type'): slivers = Sliver({'type': node['sliver_type']}) else: # Planet lab slivers = Sliver({'type': 'plab-vserver'}) # we must also advertise the available initscripts slivers['tags'] = [] if node.get('pl_initscripts'): for initscript in node.get('pl_initscripts', []): slivers['tags'].append({ 'name': 'initscript', 'value': initscript['name'] }) PGv2SliverType.add_slivers(node_elem, slivers) # advertise the node tags tags = node.get('tags', []) if tags: for tag in tags: tag['name'] = tag.pop('tagname') node_elem.add_instance( '{%s}attribute' % xml.namespaces['planetlab'], tag, ['name', 'value']) # add sliver tag in Request Rspec #if rspec_content_type == "request": # node_elem.add_instance('sliver', '', []) return node_elems