Пример #1
0
    def update_resource_provider_inventories(
            self,
            resource_provider_uuid,
            inventories,
            resource_provider_generation=None):
        """Replaces the set of inventory records for a resource provider.

        :param resource_provider_uuid: UUID of the resource provider.
        :param inventories: The inventories. A dict in the format (see:
                            Placement API ref: https://goo.gl/F22mtk)
                            {resource_class(required):
                            {allocation_ratio(required):
                            total(required):
                            max_unit(required):
                            min_unit(required):
                            reserved(required):
                            step_size(required):
                            }}
        :param resource_provider_generation: The generation of the resource
                                             provider. Optional.
        :raises PlacementResourceProviderNotFound: if the resource provider
                                                   is not found.
        :raises PlacementResourceProviderGenerationConflict: if the generation
                                                             of the resource
                                                             provider does not
                                                             match with the
                                                             server side.
        :returns: The updated set of inventory records.
        """
        if resource_provider_generation is None:
            resource_provider_generation = self.get_resource_provider(
                resource_provider_uuid=resource_provider_uuid)['generation']
        url = '/resource_providers/%s/inventories' % resource_provider_uuid
        body = {
            'resource_provider_generation': resource_provider_generation,
            'inventories': inventories
        }
        try:
            return self._put(url, body).json()
        except ks_exc.NotFound:
            raise n_exc.PlacementResourceProviderNotFound(
                resource_provider=resource_provider_uuid)
        except ks_exc.Conflict:
            raise n_exc.PlacementResourceProviderGenerationConflict(
                resource_provider=resource_provider_uuid,
                generation=resource_provider_generation)
Пример #2
0
    def _put_with_retry_for_generation_conflict(
            self,
            url,
            body,
            resource_provider_uuid,
            resource_provider_generation=None):

        if resource_provider_generation is None:
            # If the client's user did not supply a generation to us we dare to
            # retry without handing the control back to our caller.
            max_tries = GENERATION_CONFLICT_RETRIES
        else:
            # If the client's user supplied a generation to us we don't dare to
            # retry on her behalf since we don't know her intention.
            max_tries = 1

        body['resource_provider_generation'] = resource_provider_generation

        for i in range(max_tries):
            if resource_provider_generation is None:
                # In the bodies of
                # PUT /resource_providers/{uuid}/traits
                # PUT /resource_providers/{uuid}/inventories
                # PUT /resource_providers/{uuid}/inventories/{resource_class}
                # resource_provider_generation happens to be at the same place.
                body['resource_provider_generation'] = \
                    self.get_resource_provider(
                        resource_provider_uuid=resource_provider_uuid)[
                            'generation']
            try:
                return self._put(url, body).json()
            except ks_exc.Conflict as e:
                if e.response.json(
                )['errors'][0]['code'] == 'placement.concurrent_update':
                    continue
                else:
                    raise

        raise n_exc.PlacementResourceProviderGenerationConflict(
            resource_provider=resource_provider_uuid,
            generation=body['resource_provider_generation'])