Exemple #1
0
    def provision(self, urns, options=None):
        if options is None: options={}
        # update users
        slices = PlSlices(self)
        aggregate = PlAggregate(self)
        slivers = aggregate.get_slivers(urns)
        if not slivers:
            sliver_id_parts = Xrn(urns[0]).get_sliver_id_parts()
            filter = {}
            try:
                filter['slice_id'] = int(sliver_id_parts[0])
            except ValueError:
                filter['name'] = sliver_id_parts[0]
            slices = self.shell.GetSlices(filter,['hrn'])
            if not slices:
                raise Forbidden("Unable to locate slice record for sliver:  %s" % xrn)
            slice = slices[0]
            slice_urn = hrn_to_urn(slice['hrn'], type='slice')
            urns = [slice_urn]          
        else:    
            slice_id = slivers[0]['slice_id']
            slice_hrn = self.shell.GetSliceHrn(slice_id)
            slice = self.shell.GetSlices({'slice_id': slice_id})[0]
            slice['hrn'] = slice_hrn
            sfa_peer = slices.get_sfa_peer(slice['hrn'])
            users = options.get('geni_users', [])
            persons = slices.verify_persons(slice['hrn'], slice, users, sfa_peer, options=options)
            # update sliver allocation states and set them to geni_provisioned
            sliver_ids = [sliver['sliver_id'] for sliver in slivers]
            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)
Exemple #2
0
    def provision(self, urns, options={}):
        # update users
        slices = PlSlices(self)
        aggregate = PlAggregate(self)
        slivers = aggregate.get_slivers(urns)
        if not slivers:
            sliver_id_parts = Xrn(urns[0]).get_sliver_id_parts()
            filter = {}
            try:
                filter['slice_id'] = int(sliver_id_parts[0])
            except ValueError:
                filter['name'] = sliver_id_parts[0]
            slices = self.shell.GetSlices(filter, ['hrn'])
            if not slices:
                raise Forbidden(
                    "Unable to locate slice record for sliver:  %s" % xrn)
            slice = slices[0]
            slice_urn = hrn_to_urn(slice['hrn'], type='slice')
            urns = [slice_urn]
        else:
            slice_id = slivers[0]['slice_id']
            slice_hrn = self.shell.GetSliceHrn(slice_id)
            slice = self.shell.GetSlices({'slice_id': slice_id})[0]
            slice['hrn'] = slice_hrn
            sfa_peer = slices.get_sfa_peer(slice['hrn'])
            users = options.get('geni_users', [])
            persons = slices.verify_persons(slice['hrn'],
                                            slice,
                                            users,
                                            sfa_peer,
                                            options=options)
            # update sliver allocation states and set them to geni_provisioned
            sliver_ids = [sliver['sliver_id'] for sliver in slivers]
            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)
Exemple #3
0
 def prepare_slice(self, api, slice_xrn, creds, users):
     reg_objects = self._get_registry_objects(slice_xrn, creds, users)
     (hrn, type) = urn_to_hrn(slice_xrn)
     slices = PlSlices(self.driver)
     peer = slices.get_peer(hrn)
     sfa_peer = slices.get_sfa_peer(hrn)
     slice_record = None
     if users:
         slice_record = users[0].get('slice_record', {})
     registry = api.registries[api.hrn]
     credential = api.getCredential()
     # ensure site record exists
     site = slices.verify_site(hrn, slice_record, peer, sfa_peer)
     # ensure slice record exists
     slice = slices.verify_slice(hrn, slice_record, peer, sfa_peer)
     # ensure person records exists
     persons = slices.verify_persons(hrn, slice, users, peer, sfa_peer)
 def prepare_slice(self, api, slice_xrn, creds, users):
     reg_objects = self._get_registry_objects(slice_xrn, creds, users)
     (hrn, type) = urn_to_hrn(slice_xrn)
     slices = PlSlices(self.driver)
     peer = slices.get_peer(hrn)
     sfa_peer = slices.get_sfa_peer(hrn)
     slice_record=None
     if users:
         slice_record = users[0].get('slice_record', {})
     registry = api.registries[api.hrn]
     credential = api.getCredential()
     # ensure site record exists
     site = slices.verify_site(hrn, slice_record, peer, sfa_peer)
     # ensure slice record exists
     slice = slices.verify_slice(hrn, slice_record, peer, sfa_peer)
     # ensure person records exists
     persons = slices.verify_persons(hrn, slice, users, peer, sfa_peer)
Exemple #5
0
    def create_sliver (self, slice_urn, slice_hrn, creds, rspec_string, users, options):

        aggregate = PlAggregate(self)
        slices = PlSlices(self)
        peer = slices.get_peer(slice_hrn)
        sfa_peer = slices.get_sfa_peer(slice_hrn)
        slice_record=None    
        if users:
            slice_record = users[0].get('slice_record', {})
    
        # parse rspec
        rspec = RSpec(rspec_string)
        requested_attributes = rspec.version.get_slice_attributes()
        
        # ensure site record exists
        site = slices.verify_site(slice_hrn, slice_record, peer, sfa_peer, options=options)
        # ensure slice record exists
        slice = slices.verify_slice(slice_hrn, slice_record, peer, sfa_peer, options=options)
        # ensure person records exists
        persons = slices.verify_persons(slice_hrn, slice, users, peer, sfa_peer, options=options)
        # ensure slice attributes exists
        slices.verify_slice_attributes(slice, requested_attributes, options=options)
        
        # add/remove slice from nodes
        requested_slivers = {}
        slivers = rspec.version.get_nodes_with_slivers() 
        nodes = slices.verify_slice_nodes(slice, slivers, peer) 
   
        # add/remove links links 
        slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)

        # add/remove leases
        rspec_requested_leases = rspec.version.get_leases()
        leases = slices.verify_slice_leases(slice, rspec_requested_leases, peer)
        #requested_leases = []
        #kept_leases = []
        #for lease in rspec.version.get_leases():
        #    requested_lease = {}
        #    if not lease.get('lease_id'):
        #       requested_lease['hostname'] = xrn_to_hostname(lease.get('component_id').strip())
        #       requested_lease['start_time'] = lease.get('start_time')
        #       requested_lease['duration'] = lease.get('duration')
        #    else:
        #       kept_leases.append(int(lease['lease_id']))
        #    if requested_lease.get('hostname'):
        #        requested_leases.append(requested_lease)

        #leases = slices.verify_slice_leases(slice, requested_leases, kept_leases, peer)
    
        # handle MyPLC peer association.
        # only used by plc and ple.
        slices.handle_peer(site, slice, persons, peer)
        
        return aggregate.get_rspec(slice_xrn=slice_urn, 
                                   version=rspec.version)
 def CreateSliver(api, slice_xrn, creds, xml, users, options):
     call_id = options.get('call_id') 
     if Callids().already_handled(call_id): return ""
 
     logger = logging.getLogger('EucaAggregate')
     logger.debug("In CreateSliver")
 
     aggregate = PlAggregate(self.driver)
     slices = PlSlices(self.driver)
     (hrn, type) = urn_to_hrn(slice_xrn)
     peer = slices.get_peer(hrn)
     sfa_peer = slices.get_sfa_peer(hrn)
     slice_record=None
     if users:
         slice_record = users[0].get('slice_record', {})
 
     conn = self.getEucaConnection()
     if not conn:
         logger.error('Cannot create a connection to Eucalyptus')
         return ""
 
     # Validate RSpec
     schemaXML = ET.parse(AggregateManagerEucalyptus.EUCALYPTUS_RSPEC_SCHEMA)
     rspecValidator = ET.RelaxNG(schemaXML)
     rspecXML = ET.XML(xml)
     for network in rspecXML.iterfind("./network"):
         if network.get('name') != AggregateManagerEucalyptus.cloud['name']:
             # Throw away everything except my own RSpec
             # sfa_logger().error("CreateSliver: deleting %s from rspec"%network.get('id'))
             network.getparent().remove(network)
     if not rspecValidator(rspecXML):
         error = rspecValidator.error_log.last_error
         message = '%s (line %s)' % (error.message, error.line) 
         raise InvalidRSpec(message)
 
     """
     Create the sliver[s] (slice) at this aggregate.
     Verify HRN and initialize the slice record in PLC if necessary.
     """
 
     # ensure site record exists
     site = slices.verify_site(hrn, slice_record, peer, sfa_peer)
     # ensure slice record exists
     slice = slices.verify_slice(hrn, slice_record, peer, sfa_peer)
     # ensure person records exists
     persons = slices.verify_persons(hrn, slice, users, peer, sfa_peer)
 
     # Get the slice from db or create one.
     s = Slice.select(Slice.q.slice_hrn == hrn).getOne(None)
     if s is None:
         s = Slice(slice_hrn = hrn)
 
     # Process any changes in existing instance allocation
     pendingRmInst = []
     for sliceInst in s.instances:
         pendingRmInst.append(sliceInst.instance_id)
     existingInstGroup = rspecXML.findall(".//euca_instances")
     for instGroup in existingInstGroup:
         for existingInst in instGroup:
             if existingInst.get('id') in pendingRmInst:
                 pendingRmInst.remove(existingInst.get('id'))
     for inst in pendingRmInst:
         dbInst = EucaInstance.select(EucaInstance.q.instance_id == inst).getOne(None)
         if dbInst.meta.state != 'deleted':
             logger.debug('Instance %s will be terminated' % inst)
             # Terminate instances one at a time for robustness
             conn.terminate_instances([inst])
             # Only change the state but do not remove the entry from the DB.
             dbInst.meta.state = 'deleted'
             #dbInst.destroySelf()
 
     # Process new instance requests
     requests = rspecXML.findall(".//request")
     if requests:
         # Get all the public keys associate with slice.
         keys = []
         for user in users:
             keys += user['keys']
             logger.debug("Keys: %s" % user['keys'])
         pubKeys = '\n'.join(keys)
         logger.debug('Passing the following keys to the instance:\n%s' % pubKeys)
     for req in requests:
         vmTypeElement = req.getparent()
         instType = vmTypeElement.get('name')
         numInst  = int(req.find('instances').text)
         
         bundleName = req.find('bundle').text
         if not AggregateManagerEucalyptus.cloud['imageBundles'][bundleName]:
             logger.error('Cannot find bundle %s' % bundleName)
         bundleInfo = AggregateManagerEucalyptus.cloud['imageBundles'][bundleName]
         instKernel  = bundleInfo['kernelID']
         instDiskImg = bundleInfo['imageID']
         instRamDisk = bundleInfo['ramdiskID']
         instKey     = None
 
         # Create the instances
         for i in range(0, numInst):
             eucaInst = EucaInstance(slice      = s,
                                     kernel_id  = instKernel,
                                     image_id   = instDiskImg,
                                     ramdisk_id = instRamDisk,
                                     key_pair   = instKey,
                                     inst_type  = instType,
                                     meta       = Meta(start_time=datetime.datetime.now()))
             eucaInst.reserveInstance(conn, pubKeys)
 
     # xxx - should return altered rspec 
     # with enough data for the client to understand what's happened
     return xml
Exemple #7
0
    def allocate (self, urn, rspec_string, expiration, options=None):
        if options is None: options={}
        xrn = Xrn(urn)
        aggregate = PlAggregate(self)
        slices = PlSlices(self)
        sfa_peer = slices.get_sfa_peer(xrn.get_hrn())
        slice_record=None    
        users = options.get('geni_users', [])

        if users:
            slice_record = users[0].get('slice_record', {})
    
        # parse rspec
        rspec = RSpec(rspec_string)
        requested_attributes = rspec.version.get_slice_attributes()
        
        # ensure site record exists
        site = slices.verify_site(xrn.hrn, slice_record, sfa_peer, options=options)
        # ensure slice record exists
        slice = slices.verify_slice(xrn.hrn, slice_record, sfa_peer, expiration=expiration, options=options)
        # ensure person records exists
        persons = slices.verify_persons(xrn.hrn, slice, users, sfa_peer, options=options)
        # ensure slice attributes exists
        slices.verify_slice_attributes(slice, requested_attributes, options=options)
       
        # add/remove slice from nodes
        request_nodes = rspec.version.get_nodes_with_slivers()
        nodes = slices.verify_slice_nodes(urn, slice, request_nodes)
         
        # add/remove links links 
        slices.verify_slice_links(slice, rspec.version.get_link_requests(), nodes)

        # add/remove leases
        rspec_requested_leases = rspec.version.get_leases()
        leases = slices.verify_slice_leases(slice, rspec_requested_leases)

        return aggregate.describe([xrn.get_urn()], version=rspec.version)
Exemple #8
0
    def allocate(self, urn, rspec_string, expiration, options={}):
        xrn = Xrn(urn)
        aggregate = PlAggregate(self)
        slices = PlSlices(self)
        sfa_peer = slices.get_sfa_peer(xrn.get_hrn())
        slice_record = None
        users = options.get('geni_users', [])

        if users:
            slice_record = users[0].get('slice_record', {})

        # parse rspec
        rspec = RSpec(rspec_string)
        requested_attributes = rspec.version.get_slice_attributes()

        # ensure site record exists
        site = slices.verify_site(xrn.hrn,
                                  slice_record,
                                  sfa_peer,
                                  options=options)
        # ensure slice record exists
        slice = slices.verify_slice(xrn.hrn,
                                    slice_record,
                                    sfa_peer,
                                    expiration=expiration,
                                    options=options)
        # ensure person records exists
        persons = slices.verify_persons(xrn.hrn,
                                        slice,
                                        users,
                                        sfa_peer,
                                        options=options)
        # ensure slice attributes exists
        slices.verify_slice_attributes(slice,
                                       requested_attributes,
                                       options=options)

        # add/remove slice from nodes
        request_nodes = rspec.version.get_nodes_with_slivers()
        nodes = slices.verify_slice_nodes(urn, slice, request_nodes)

        # add/remove links links
        slices.verify_slice_links(slice, rspec.version.get_link_requests(),
                                  nodes)

        # add/remove leases
        rspec_requested_leases = rspec.version.get_leases()
        leases = slices.verify_slice_leases(slice, rspec_requested_leases)

        return aggregate.describe([xrn.get_urn()], version=rspec.version)