Exemple #1
0
    def verify_slice(self,
                     slice_hrn,
                     slice_record,
                     sfa_peer,
                     expiration,
                     options={}):
        #top_auth_hrn = top_auth(slice_hrn)
        #site_hrn = '.'.join(slice_hrn.split('.')[:-1])
        #slice_part = slice_hrn.split('.')[-1]
        #if top_auth_hrn == self.driver.hrn:
        #    login_base = slice_hrn.split('.')[-2][:12]
        #else:
        #    login_base = hash_loginbase(site_hrn)
        #slice_name = '_'.join([login_base, slice_part])
        plxrn = PlXrn(xrn=slice_hrn)
        slice_hrn = plxrn.get_hrn()
        type = plxrn.get_type()
        site_hrn = plxrn.get_authority_hrn()
        authority_name = plxrn.pl_authname()
        slicename = plxrn.pl_slicename()
        login_base = plxrn.pl_login_base()

        slices = self.driver.shell.GetSlices({'peer_id': None},
                                             ['slice_id', 'name', 'hrn'])
        # Filter slices by HRN
        slice_exists = [slice for slice in slices if slice['hrn'] == slice_hrn]
        expires = int(datetime_to_epoch(utcparse(expiration)))
        if not slice_exists:
            if slice_record:
                url = slice_record.get('url', slice_hrn)
                description = slice_record.get('description', slice_hrn)
            else:
                url = slice_hrn
                description = slice_hrn
            slice = {
                'name': slice_name,
                'url': url,
                'description': description
            }
            # add the slice
            slice['slice_id'] = self.driver.shell.AddSlice(slice)
            # set the slice HRN
            self.driver.shell.SetSliceHrn(int(slice['slice_id']), slice_hrn)
            # Tag this as created through SFA
            self.driver.shell.SetSliceSfaCreated(int(slice['slice_id']),
                                                 'True')
            # set the expiration
            self.driver.shell.UpdateSlice(int(slice['slice_id']),
                                          {'expires': expires})

        else:
            slice = slice_exists[0]
            #Update expiration if necessary
            if slice.get('expires', None) != expires:
                self.driver.shell.UpdateSlice(int(slice['slice_id']),
                                              {'expires': expires})

        return self.driver.shell.GetSlices(int(slice['slice_id']))[0]
Exemple #2
0
    def verify_site(self,
                    slice_xrn,
                    slice_record={},
                    sfa_peer=None,
                    options={}):
        #(slice_hrn, type) = urn_to_hrn(slice_xrn)
        #top_auth_hrn = top_auth(slice_hrn)
        #site_hrn = '.'.join(slice_hrn.split('.')[:-1])
        #if top_auth_hrn == self.driver.hrn:
        #    login_base = slice_hrn.split('.')[-2][:12]
        #else:
        #    login_base = hash_loginbase(site_hrn)
        plxrn = PlXrn(xrn=slice_xrn)
        slice_hrn = plxrn.get_hrn()
        type = plxrn.get_type()
        site_hrn = plxrn.get_authority_hrn()
        authority_name = plxrn.pl_authname()
        slicename = plxrn.pl_slicename()
        login_base = plxrn.pl_login_base()

        sites = self.driver.shell.GetSites(
            {'peer_id': None},
            ['site_id', 'name', 'abbreviated_name', 'login_base', 'hrn'])

        # filter sites by hrn
        site_exists = [site for site in sites if site['hrn'] == site_hrn]

        if not site_exists:
            # create new site record
            site = {
                'name': 'sfa:%s' % site_hrn,
                'abbreviated_name': site_hrn,
                'login_base': login_base,
                'max_slices': 100,
                'max_slivers': 1000,
                'enabled': True,
                'peer_site_id': None
            }

            site['site_id'] = self.driver.shell.AddSite(site)
            # Set site HRN
            self.driver.shell.SetSiteHrn(int(site['site_id']), site_hrn)
            # Tag this as created through SFA
            self.driver.shell.SetSiteSfaCreated(int(site['site_id']), 'True')
            # exempt federated sites from monitor policies
            self.driver.shell.AddSiteTag(int(site['site_id']),
                                         'exempt_site_until', "20200101")

        else:
            site = site_exists[0]

        return site
Exemple #3
0
    def get_slivers(self, urns, options=None):
        if options is None: options={}
        names = set()
        slice_ids = set()
        node_ids = []
        slice_hrn = None
        for urn in urns:
            xrn = PlXrn(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_hrn = xrn.get_hrn()

        filter = {}
        filter['peer_id'] = None
        if slice_ids:
            filter['slice_id'] = list(slice_ids)
        # get all slices
        all_slices = self.driver.shell.GetSlices(filter, ['slice_id', 'name', 'hrn', 'person_ids', 'node_ids', 'slice_tag_ids', 'expires'])
        if slice_hrn:
            slices = [slice for slice in all_slices if slice['hrn'] == slice_hrn]
        else:
            slices = all_slices
      
        if not slices:
            return []
        slice = slices[0]     
        slice['hrn'] = slice_hrn   

        # get sliver users
        persons = []
        person_ids = []
        for slice in slices:
            person_ids.extend(slice['person_ids'])
        if person_ids:
            persons = self.driver.shell.GetPersons(person_ids)
                 
        # get user keys
        keys = {}
        key_ids = []
        for person in persons:
            key_ids.extend(person['key_ids'])
        
        if key_ids:
            key_list = self.driver.shell.GetKeys(key_ids)
            for key in key_list:
                keys[key['key_id']] = key  

        # construct user key info
        users = []
        for person in persons:
            person_urn = hrn_to_urn(self.driver.shell.GetPersonHrn(int(person['person_id'])), 'user')
            user = {
                'login': slice['name'], 
                'user_urn': person_urn,
                'keys': [keys[k_id]['key'] for k_id in person['key_ids'] if k_id in keys]
            }
            users.append(user)

        if node_ids:
            node_ids = [node_id for node_id in node_ids if node_id in slice['node_ids']]
            slice['node_ids'] = node_ids
        tags_dict = self.get_slice_tags(slice)
        nodes_dict = self.get_slice_nodes(slice, options)
        slivers = []
        for node in nodes_dict.values():
            node.update(slice) 
            node['tags'] = tags_dict[node['node_id']]
            sliver_hrn = '%s.%s-%s' % (self.driver.hrn, slice['slice_id'], node['node_id'])
            node['sliver_id'] = Xrn(sliver_hrn, type='sliver').urn
            node['urn'] = node['sliver_id'] 
            node['services_user'] = users
            slivers.append(node)
        return slivers
Exemple #4
0
    def get_slivers(self, urns, options={}):
        names = set()
        slice_ids = set()
        node_ids = []
        slice_hrn = None
        for urn in urns:
            xrn = PlXrn(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_hrn = xrn.get_hrn()

        filter = {}
        filter['peer_id'] = None
        if slice_ids:
            filter['slice_id'] = list(slice_ids)
        # get all slices
        all_slices = self.driver.shell.GetSlices(filter, [
            'slice_id', 'name', 'hrn', 'person_ids', 'node_ids',
            'slice_tag_ids', 'expires'
        ])
        if slice_hrn:
            slices = [
                slice for slice in all_slices if slice['hrn'] == slice_hrn
            ]
        else:
            slices = all_slices

        if not slices:
            return []
        slice = slices[0]
        slice['hrn'] = slice_hrn

        # get sliver users
        persons = []
        person_ids = []
        for slice in slices:
            person_ids.extend(slice['person_ids'])
        if person_ids:
            persons = self.driver.shell.GetPersons(person_ids)

        # get user keys
        keys = {}
        key_ids = []
        for person in persons:
            key_ids.extend(person['key_ids'])

        if key_ids:
            key_list = self.driver.shell.GetKeys(key_ids)
            for key in key_list:
                keys[key['key_id']] = key

        # construct user key info
        users = []
        for person in persons:
            person_urn = hrn_to_urn(
                self.driver.shell.GetPersonHrn(int(person['person_id'])),
                'user')
            user = {
                'login':
                slice['name'],
                'user_urn':
                person_urn,
                'keys': [
                    keys[k_id]['key'] for k_id in person['key_ids']
                    if k_id in keys
                ]
            }
            users.append(user)

        if node_ids:
            node_ids = [
                node_id for node_id in node_ids if node_id in slice['node_ids']
            ]
            slice['node_ids'] = node_ids
        tags_dict = self.get_slice_tags(slice)
        nodes_dict = self.get_slice_nodes(slice, options)
        slivers = []
        for node in nodes_dict.values():
            node.update(slice)
            node['tags'] = tags_dict[node['node_id']]
            sliver_hrn = '%s.%s-%s' % (self.driver.hrn, slice['slice_id'],
                                       node['node_id'])
            node['sliver_id'] = Xrn(sliver_hrn, type='sliver').urn
            node['urn'] = node['sliver_id']
            node['services_user'] = users
            slivers.append(node)
        return slivers