Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
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())
Esempio n. 4
0
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)
Esempio n. 5
0
def xrn_to_hostname(hrn):
    return Xrn.unescape(PlXrn(xrn=hrn, type='node').get_leaf())
Esempio n. 6
0
def xrn_to_hostname(hrn):
    return Xrn.unescape(PlXrn(xrn=hrn, type='node').get_leaf())
Esempio n. 7
0
 def private_key_filename (self): 
     return self.fullpath ("%s.pkey" % Xrn.unescape(self.hrn))
Esempio n. 8
0
    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', '', []) 
Esempio n. 9
0
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)                
Esempio n. 10
0
def slab_xrn_to_hostname(xrn):
    return Xrn.unescape(Xrn(xrn=xrn, type='node').get_leaf())
Esempio n. 11
0
def xrn_to_channel(hrn):
    return Xrn.unescape(NitosXrn(xrn=hrn, type='channel').get_leaf())
Esempio n. 12
0
def xrn_to_channel(hrn):
    return Xrn.unescape(NitosXrn(xrn=hrn, type='channel').get_leaf())
Esempio n. 13
0
    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
Esempio n. 14
0
    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', '', []) 
Esempio n. 15
0
    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