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)
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
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
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()
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)
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
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
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
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
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)
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)
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)