Esempio n. 1
0
    def provision(self, urns, options=None):
        if options is None: options={}
        # update sliver allocation states and set them to geni_provisioned
        aggregate = OSAggregate(self)

        # Update connection for the current client
        xrn = Xrn(urns[0], type='slice')
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        tenant_name = OSXrn(xrn=urns[0], type='slice').get_hrn() 
        self.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)
        
        instances = aggregate.get_instances(xrn)
        # Allocate new floating IP per the instance
        servers = aggregate.check_floatingip(instances, True)
        aggregate.create_floatingip(tenant_name, servers)

        sliver_ids=[]
        for instance in instances:
            sliver_id = OSXrn(name=('koren'+'.'+ instance.name), id=instance.id, type='node+openstack').get_urn()
            sliver_ids.append(sliver_id)
        dbsession=self.api.dbsession()
        SliverAllocation.set_allocations(sliver_ids, 'geni_provisioned', dbsession)
        version_manager = VersionManager()
        rspec_version = version_manager.get_version(options['geni_rspec_version'])
        return self.describe(urns, rspec_version, options=options)
Esempio n. 2
0
 def register_user(self, sfa_record, hrn, pub_key):
     # add person roles, projects and keys
     email = sfa_record.get('email', None)
     xrn = Xrn(hrn)
     name = xrn.get_leaf()
     auth_hrn = xrn.get_authority_hrn()
     tenant_name = OSXrn(xrn=auth_hrn, type='authority').get_tenant_name()
     tenant = self.shell.auth_manager.tenants.find(name=tenant_name)
     self.shell.auth_manager.users.create(name,
                                          email=email,
                                          tenant_id=tenant.id)
     user = self.shell.auth_manager.users.find(name=name)
     slices = sfa_records.get('slices', [])
     for slice in projects:
         slice_tenant_name = OSXrn(xrn=slice,
                                   type='slice').get_tenant_name()
         slice_tenant = self.shell.auth_manager.tenants.find(
             name=slice_tenant_name)
         self.shell.auth_manager.roles.add_user_role(
             user, slice_tenant, 'user')
     keys = sfa_records.get('keys', [])
     for key in keys:
         keyname = OSXrn(xrn=hrn, type='user').get_slicename()
         self.shell.nova_client.keypairs.create(keyname, key)
     return user
Esempio n. 3
0
    def describe(self, urns, version=None, options=None):
        if options is None: options={}
        version_manager = VersionManager()
        version = version_manager.get_version(version)
        rspec_version = version_manager._get_version(version.type, version.version, 'manifest')
        rspec = RSpec(version=rspec_version, user_options=options)

        # Update connection for the current user
        xrn = Xrn(urns[0], type='slice')
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        tenant_name = OSXrn(xrn=urns[0], type='slice').get_hrn()
        self.driver.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)

        # For delay to collect instance info 
        time.sleep(3)
        # Get instances from the Openstack
        instances = self.get_instances(xrn)

        # Add sliver(s) from instance(s)
        geni_slivers = []
        rspec.xml.set( 'expires',  datetime_to_string(utcparse(time.time())) )
        rspec_nodes = []
        for instance in instances:
            rspec_nodes.append(self.instance_to_rspec_node(instance))
            geni_sliver = self.instance_to_geni_sliver(instance)
            geni_slivers.append(geni_sliver)
        rspec.version.add_nodes(rspec_nodes)

        result = { 'geni_urn': xrn.get_urn(),
                   'geni_rspec': rspec.toxml(), 
                   'geni_slivers': geni_slivers }
        return result
Esempio n. 4
0
    def delete_instance(self, instance):
    
        def _delete_security_group(inst):
            security_group = inst.metadata.get('security_groups', '')
            if security_group:
                manager = SecurityGroup(self.driver)
                timeout = 10.0 # wait a maximum of 10 seconds before forcing the security group delete
                start_time = time.time()
                instance_deleted = False
                while instance_deleted == False and (time.time() - start_time) < timeout:
                    tmp_inst = self.driver.shell.compute_manager.servers.findall(id=inst.id)
                    if not tmp_inst:
                        instance_deleted = True
                    time.sleep(.5)
                manager.delete_security_group(security_group)

        multiclient = MultiClient()
        tenant = self.driver.shell.auth_manager.tenants.find(id=instance.tenant_id)
        
        # Update connection for the current client
        xrn = Xrn(tenant.name)
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        self.driver.shell.compute_manager.connect(username=user_name, tenant=tenant.name, password=user_name)

        args = { 'name': instance.name,
                 'id': instance.id }
        instances = self.driver.shell.compute_manager.servers.findall(**args)
        security_group_manager = SecurityGroup(self.driver)
        for instance in instances:
            # destroy instance
            self.driver.shell.compute_manager.servers.delete(instance)
            # deleate this instance's security groups
            multiclient.run(_delete_security_group, instance)
        return 1
Esempio n. 5
0
    def restart_instances(self, instacne_name, tenant_name, id=None):
        # Update connection for the current client
        xrn = Xrn(tenant_name)
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        self.driver.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)

        self.stop_instances(instance_name, tenant_name, id)
        self.start_instances(instance_name, tenant_name, id)
        return 1 
Esempio n. 6
0
    def start_instances(self, instance_name, tenant_name, id=None):
        # Update connection for the current client
        xrn = Xrn(tenant_name)
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        self.driver.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)

        args = { 'name': instance_name }
        if id:
            args['id'] = id
        instances = self.driver.shell.compute_manager.servers.findall(**args)
        for instance in instances:
            self.driver.shell.compute_manager.servers.resume(instance)
        return 1
Esempio n. 7
0
    def shutdown(self, urn, options=None):
        if options is None: options={}

        # Update connection for the current client
        xrn = Xrn(urn)
        osxrn = OSXrn(xrn=urn, type='slice')
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        tenant_name = osxrn.get_hrn()
        self.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)

        instances = self.shell.compute_manager.servers.findall(name=osxrn.get_slicename())
        for instance in instances:
            self.shell.compute_manager.servers.shutdown(instance.id)
        return True
Esempio n. 8
0
    def delete(self, urns, options=None):
        if options is None: options={}
        aggregate = OSAggregate(self)

        # Update connection for the current client
        xrn = Xrn(urns[0], type='slice')
        user_name = xrn.get_authority_hrn() + '.' + xrn.leaf.split('-')[0]
        tenant_name = OSXrn(xrn=urns[0], type='slice').get_hrn()
        self.shell.compute_manager.connect(username=user_name, tenant=tenant_name, password=user_name)

        # collect sliver ids so we can update sliver allocation states after
        # we remove the slivers.
        instances = aggregate.get_instances(xrn)
        # Release the floating IPs of instances
        servers = aggregate.check_floatingip(instances, False)
        aggregate.delete_floatingip(servers)

        sliver_ids = []
        id_set = set()
        for instance in instances:
            sliver_id = OSXrn(name=('koren'+'.'+ instance.name), id=instance.id, type='node+openstack').get_urn()
            sliver_ids.append(sliver_id)
            # delete the instance related with requested tenant
            aggregate.delete_instance(instance)
            id_set.add(instance.tenant_id)       

        tenant_ids = list(id_set)
        for tenant_id in tenant_ids:
            # Delete both the router(s) and interfaces related with requested tenant
            aggregate.delete_router(tenant_id=tenant_id)
            # Delete both the network and subnet related with requested tenant
            aggregate.delete_network(tenant_id=tenant_id)

        # Delete sliver allocation states
        dbsession=self.api.dbsession()
        SliverAllocation.delete_allocations(sliver_ids, dbsession)

        # Return geni_slivers
        geni_slivers = []
        for sliver_id in sliver_ids:
            geni_slivers.append(
                { 'geni_sliver_urn': sliver_id,
                  'geni_allocation_status': 'geni_unallocated',
#                  'geni_expires': datetime_to_string(utcparse(time.time())) })
                  'geni_expires': None })
        return geni_slivers
Esempio n. 9
0
 def register_user(self, sfa_record, hrn, pub_key):
     # add person roles, projects and keys
     email = sfa_record.get('email', None)
     xrn = Xrn(hrn)
     name = xrn.get_leaf()
     auth_hrn = xrn.get_authority_hrn()
     tenant_name = OSXrn(xrn=auth_hrn, type='authority').get_tenant_name()  
     tenant = self.shell.auth_manager.tenants.find(name=tenant_name)  
     self.shell.auth_manager.users.create(name, email=email, tenant_id=tenant.id)
     user = self.shell.auth_manager.users.find(name=name)
     slices = sfa_records.get('slices', [])
     for slice in projects:
         slice_tenant_name = OSXrn(xrn=slice, type='slice').get_tenant_name()
         slice_tenant = self.shell.auth_manager.tenants.find(name=slice_tenant_name)
         self.shell.auth_manager.roles.add_user_role(user, slice_tenant, 'user')
     keys = sfa_records.get('keys', [])
     for key in keys:
         keyname = OSXrn(xrn=hrn, type='user').get_slicename()
         self.shell.nova_client.keypairs.create(keyname, key)
     return user
Esempio n. 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)