Пример #1
0
    def allocate(self, urn, rspec_string, expiration, options={}):
        xrn = Xrn(urn)
        aggregate = OSAggregate(self)

        # assume first user is the caller and use their context
        # for the ec2/euca api connection. Also, use the first users
        # key as the project key.
        key_name = None
        if len(users) > 1:
            key_name = aggregate.create_instance_key(xrn.get_hrn(), users[0])

        # collect public keys
        users = options.get('geni_users', [])
        pubkeys = []
        for user in users:
            pubkeys.extend(user['keys'])

        rspec = RSpec(rspec_string)
        instance_name = hrn_to_os_slicename(slice_hrn)
        tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name()
        slivers = aggregate.run_instances(instance_name, tenant_name, \
                                          rspec_string, key_name, pubkeys)

        # update all sliver allocation states setting then to geni_allocated
        sliver_ids = [sliver.id for sliver in slivers]
        dbsession = self.api.dbsession()
        SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',
                                         dbsession)

        return aggregate.describe(urns=[urn], version=rspec.version)
Пример #2
0
    def update (self, old_sfa_record, new_sfa_record, hrn, new_key):
        type = new_sfa_record['type'] 
        
        # new_key implemented for users only
        if new_key and type not in [ 'user' ]:
            raise UnknownSfaType(type)

        elif type == "slice":
            # can update project manager and description
            name = hrn_to_os_slicename(hrn)
            researchers = sfa_record.get('researchers', [])
            pis = sfa_record.get('pis', [])
            project_manager = None
            description = sfa_record.get('description', None)
            if pis:
                project_manager = Xrn(pis[0], 'user').get_hrn()
            elif researchers:
                project_manager = Xrn(researchers[0], 'user').get_hrn()
            self.shell.auth_manager.modify_project(name, project_manager, description)

        elif type == "user":
            # TODO: check if user is or not.
            # can techinally update access_key and secret_key,
            # but that is not in our scope, so we do nothing.  
            pass
        return True
Пример #3
0
    def update(self, old_sfa_record, new_sfa_record, hrn, new_key):
        type = new_sfa_record['type']

        # new_key implemented for users only
        if new_key and type not in ['user']:
            raise UnknownSfaType(type)

        elif type == "slice":
            # can update project manager and description
            name = hrn_to_os_slicename(hrn)
            researchers = sfa_record.get('researchers', [])
            pis = sfa_record.get('pis', [])
            project_manager = None
            description = sfa_record.get('description', None)
            if pis:
                project_manager = Xrn(pis[0], 'user').get_leaf()
            elif researchers:
                project_manager = Xrn(researchers[0], 'user').get_leaf()
            self.shell.auth_manager.modify_project(name, project_manager,
                                                   description)

        elif type == "user":
            # can techinally update access_key and secret_key,
            # but that is not in our scope, so we do nothing.
            pass
        return True
Пример #4
0
    def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, users, options):
   
        aggregate = OSAggregate(self)

        # assume first user is the caller and use their context
        # for the ec2/euca api connection. Also, use the first users
        # key as the project key.
        key_name = None
        if len(users) > 1:
            key_name = aggregate.create_instance_key(slice_hrn, users[0])

        # collect public keys
        pubkeys = []
        for user in users:
            pubkeys.extend(user['keys'])
           
        rspec = RSpec(rspec_string)
        instance_name = hrn_to_os_slicename(slice_hrn)
        tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name()
        instances = aggregate.run_instances(instance_name, tenant_name, rspec_string, key_name, pubkeys)
        rspec_nodes = []
        for instance in instances:
            rspec_nodes.append(aggregate.instance_to_rspec_node(slice_urn, instance))    
        version_manager = VersionManager()
        manifest_version = version_manager._get_version(rspec.version.type, rspec.version.version, 'manifest')
        manifest_rspec = RSpec(version=manifest_version, user_options=options)
        manifest_rspec.version.add_nodes(rspec_nodes) 
         
        return manifest_rspec.toxml()
Пример #5
0
    def allocate (self, urn, rspec_string, expiration, options=None):
        if options is None: options={}
        xrn = Xrn(urn) 
        aggregate = OSAggregate(self)

        # assume first user is the caller and use their context
        # for the ec2/euca api connection. Also, use the first users
        # key as the project key.
        key_name = None
        if len(users) > 1:
            key_name = aggregate.create_instance_key(xrn.get_hrn(), users[0])

        # collect public keys
        users = options.get('geni_users', [])
        pubkeys = []
        for user in users:
            pubkeys.extend(user['keys'])
           
        rspec = RSpec(rspec_string)
        instance_name = hrn_to_os_slicename(slice_hrn)
        tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name()
        slivers = aggregate.run_instances(instance_name, tenant_name, \
                                          rspec_string, key_name, pubkeys)
        
        # update all sliver allocation states setting then to geni_allocated    
        sliver_ids = [sliver.id for sliver in slivers]
        dbsession=self.api.dbsession()
        SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned',dbsession)
   
        return aggregate.describe(urns=[urn], version=rspec.version)
Пример #6
0
 def remove(self, sfa_record):
     type = sfa_record['type']
     if type == 'user':
         name = Xrn(sfa_record['hrn']).get_leaf()
         if self.shell.auth_manager.get_user(name):
             self.shell.auth_manager.delete_user(name)
     elif type == 'slice':
         name = hrn_to_os_slicename(sfa_record['hrn'])
         if self.shell.auth_manager.get_project(name):
             self.shell.auth_manager.delete_project(name)
     return True
Пример #7
0
 def remove (self, sfa_record):
     type=sfa_record['type']
     if type == 'user':
         name = Xrn(sfa_record['hrn']).get_leaf()     
         if self.shell.auth_manager.get_user(name):
             self.shell.auth_manager.delete_user(name)
     elif type == 'slice':
         name = hrn_to_os_slicename(sfa_record['hrn'])     
         if self.shell.auth_manager.get_project(name):
             self.shell.auth_manager.delete_project(name)
     return True
Пример #8
0
 def get_slice_nodes(self, slice_xrn):
     # update nova connection
     tenant_name = OSXrn(xrn=slice_xrn, type='slice').get_tenant_name()
     self.driver.shell.nova_manager.connect(tenant=tenant_name)    
     
     zones = self.get_availability_zones()
     name = hrn_to_os_slicename(slice_xrn)
     instances = self.driver.shell.nova_manager.servers.findall(name=name)
     rspec_nodes = []
     for instance in instances:
         rspec_nodes.append(self.instance_to_rspec_node(slice_xrn, instance))
     return rspec_nodes
Пример #9
0
    def sliver_status (self, slice_urn, slice_hrn):
        # update nova connection
        tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name()
        self.shell.nova_manager.connect(tenant=tenant_name)

        # find out where this slice is currently running
        project_name = hrn_to_os_slicename(slice_hrn)
        instances = self.shell.nova_manager.servers.findall(name=project_name)
        if len(instances) == 0:
            raise SliverDoesNotExist("You have not allocated any slivers here") 
        
        result = {}
        top_level_status = 'ready'
        result['geni_urn'] = slice_urn
        result['plos_login'] = '******'
        # do we need real dates here? 
        result['plos_expires'] = None
        result['geni_expires'] = None
        
        resources = []
        for instance in instances:
            res = {}
            # instances are accessed by ip, not hostname. We need to report the ip
            # somewhere so users know where to ssh to.     
            res['geni_expires'] = None
            #res['plos_hostname'] = instance.hostname
            res['plos_created_at'] = datetime_to_string(utcparse(instance.created))    
            res['plos_boot_state'] = instance.status
            res['plos_sliver_type'] = self.shell.nova_manager.flavors.find(id=instance.flavor['id']).name 
            res['geni_urn'] =  Xrn(slice_urn, type='slice', id=instance.id).get_urn()

            if instance.status.lower() == 'active':
                res['boot_state'] = 'ready'
                res['geni_status'] = 'ready'
            elif instance.status.lower() == 'error':
                res['boot_state'] = 'failed'
                res['geni_status'] = 'failed'
                top_level_status = 'failed'
            else:
                res['boot_state'] = 'notready'  
                res['geni_status'] = 'notready'
                top_level_status = 'notready'
            resources.append(res)
            
        result['geni_status'] = top_level_status
        result['geni_resources'] = resources
        return result
Пример #10
0
    def allocate (self, urn, rspec_string, expiration, options=None):
        if options is None: options={}
        aggregate = OSAggregate(self)
        rspec = RSpec(rspec_string)
        xrn = Xrn(urn)
        slice_hrn = xrn.get_hrn()
        tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_hrn()
        instance_name = hrn_to_os_slicename(slice_hrn)
        tenants = self.shell.auth_manager.tenants.findall()
        # collect public keys & get the user name
        users = options.get('geni_users', [])
        pubkeys = []
        key_name = None

        if len(users) >= 1:
            for user in users:
                # TODO: We currently support one user name.
                user_name = Xrn(user.get('urn')).get_hrn()
                pubkeys.extend(user['keys'])
            for tenant in tenants:
                # Check if the tenant of the user exists in local OS or not
                if tenant_name == tenant.name:
                    try:
                        self.shell.auth_manager.users.find(name=user_name)
                    except:
                        user = self.register_federation(user_hrn=user_name, \
                                    slice_hrn=tenant_name, keys=pubkeys, email=None)
                    break
            else:
                user = self.register_federation(user_hrn=user_name, \
                            slice_hrn=tenant_name, keys=None, email=None)
            
            # Update connection for the current client
            self.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)
            keypair_list = self.shell.compute_manager.keypairs.list()
            keyname = OSXrn(xrn=user_name, type='user').get_slicename()
            for keypair in keypair_list:
                if keyname == keypair.name:
                    key_name = keypair.name
                    break
            else:
                raise SfaNotImplemented("No handle!")
            
            # Update initial connection info
            self.init_compute_manager_conn()
#            key_name = aggregate.create_instance_key(slice_hrn, users[0])

        # In case of federation or non-options
        elif len(users) < 1:
            if options.get('actual_caller_hrn') is None:
                user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
            else:
                user_name = options.get('actual_caller_hrn')
            for tenant in tenants:
                # Check if the tenant of the user in local OS or not
                if tenant_name == tenant.name:
                    try:
                        self.shell.auth_manager.users.find(name=user_name)
                    except:
                        user = self.register_federation(user_hrn=user_name, \
                                    slice_hrn=tenant_name, keys=pubkeys, email=None)
                    break
            else:
                user = self.register_federation(user_hrn=user_name, \
                            slice_hrn=tenant_name, keys=None, email=None)
            # TODO: Wrapper for federation needs at least one pubkey of the user extracted by 'options'!!
#            name = OSXrn(xrn=user_name, type='user').get_slicename()
#            key_name = self.shell.compute_manager.keypairs.get(name).name

        else:
            raise SfaNotImplemented("No handle!")



        slivers = aggregate.run_instances(tenant_name, user_name, rspec_string, key_name, pubkeys)
        # Update sliver allocations
        for sliver in slivers:
            component_id = sliver.metadata.get('component_id')
            sliver_id = OSXrn(name=('koren'+'.'+ sliver.name), id=sliver.id, type='node+openstack').get_urn()
            record = SliverAllocation( sliver_id=sliver_id,
                                       component_id=component_id,
                                       allocation_state='geni_allocated')
            record.sync(self.api.dbsession())
        return aggregate.describe(urns=[urn], version=rspec.version)
Пример #11
0
 def update_sliver(self, slice_urn, slice_hrn, rspec, creds, options):
     name = hrn_to_os_slicename(slice_hrn)
     tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name()
     aggregate = OSAggregate(self)
     return aggregate.update_instances(name)
Пример #12
0
 def delete_sliver (self, slice_urn, slice_hrn, creds, options):
     aggregate = OSAggregate(self)
     tenant_name = OSXrn(xrn=slice_hrn, type='slice').get_tenant_name()
     project_name = hrn_to_os_slicename(slice_hrn)
     return aggregate.delete_instances(project_name, tenant_name)