Search in sources :

Example 26 with AutobindData

use of org.candlepin.resource.dto.AutobindData in project candlepin by candlepin.

the class ConsumerResource method bind.

@ApiOperation(notes = "If a pool ID is specified, we know we're binding to that exact pool. " + "Specifying an entitle date in this case makes no sense and will throw an " + "error. If a list of product IDs are specified, we attempt to auto-bind to" + " subscriptions which will provide those products. An optional date can be" + " specified allowing the consumer to get compliant for some date in the " + "future. If no date is specified we assume the current date. If neither a " + "pool nor an ID is specified, this is a healing request. The path is similar " + "to the bind by products, but in this case we use the installed products on " + "the consumer, and their current compliant status, to determine which product" + " IDs should be requested. The entitle date is used the same as with bind by " + "products. The response will contain a list of Entitlement objects if async is" + " false, or a JobDetail object if async is true.", value = "Bind Entitlements")
@ApiResponses({ @ApiResponse(code = 400, message = ""), @ApiResponse(code = 403, message = "Binds Entitlements"), @ApiResponse(code = 404, message = "") })
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/{consumer_uuid}/entitlements")
@SuppressWarnings("checkstyle:indentation")
public Response bind(@PathParam("consumer_uuid") @Verify(Consumer.class) String consumerUuid, @QueryParam("pool") @Verify(value = Pool.class, nullable = true, subResource = SubResource.ENTITLEMENTS) String poolIdString, @QueryParam("product") String[] productIds, @QueryParam("quantity") Integer quantity, @QueryParam("email") String email, @QueryParam("email_locale") String emailLocale, @QueryParam("async") @DefaultValue("false") boolean async, @QueryParam("entitle_date") String entitleDateStr, @QueryParam("from_pool") List<String> fromPools) {
    /* NOTE: This method should NEVER be provided with a POST body.
           While technically that change would be backwards compatible,
           there are older clients which erroneously provide an empty string
           as a post body and hence result in a serialization error.
           ref: BZ: 1502807
         */
    // TODO: really should do this in a before we get to this call
    // so the method takes in a real Date object and not just a String.
    Date entitleDate = ResourceDateParser.parseDateString(entitleDateStr);
    // Verify consumer exists:
    Consumer consumer = consumerCurator.verifyAndLookupConsumerWithEntitlements(consumerUuid);
    ConsumerType ctype = this.consumerTypeCurator.getConsumerType(consumer);
    log.debug("Consumer (post verify): {}", consumer);
    // Check that only one query param was set, and some other validations
    validateBindArguments(poolIdString, quantity, productIds, fromPools, entitleDate, consumer, async);
    Owner owner = ownerCurator.findOwnerById(consumer.getOwnerId());
    try {
        // I hate double negatives, but if they have accepted all
        // terms, we want comeToTerms to be true.
        long subTermsStart = System.currentTimeMillis();
        if (!ctype.isType(ConsumerTypeEnum.SHARE) && subAdapter.hasUnacceptedSubscriptionTerms(owner)) {
            return Response.serverError().build();
        }
        log.debug("Checked if consumer has unaccepted subscription terms in {}ms", (System.currentTimeMillis() - subTermsStart));
    } catch (CandlepinException e) {
        log.debug(e.getMessage());
        throw e;
    }
    if (poolIdString != null && quantity == null) {
        Pool pool = poolManager.find(poolIdString);
        quantity = pool != null ? consumerBindUtil.getQuantityToBind(pool, consumer) : 1;
    }
    // 
    if (async) {
        JobDetail detail = null;
        if (poolIdString != null) {
            detail = EntitlerJob.bindByPool(poolIdString, consumer, owner.getKey(), quantity);
        } else {
            detail = EntitleByProductsJob.bindByProducts(productIds, consumer, entitleDate, fromPools, owner.getKey());
        }
        // events will be triggered by the job
        return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(detail).build();
    }
    // 
    // otherwise we do what we do today.
    // 
    List<Entitlement> entitlements = null;
    if (poolIdString != null) {
        entitlements = entitler.bindByPoolQuantity(consumer, poolIdString, quantity);
    } else {
        try {
            AutobindData autobindData = AutobindData.create(consumer, owner).on(entitleDate).forProducts(productIds).withPools(fromPools);
            entitlements = entitler.bindByProducts(autobindData);
        } catch (AutobindDisabledForOwnerException e) {
            throw new BadRequestException(i18n.tr("Ignoring request to auto-attach. " + "It is disabled for org \"{0}\".", owner.getKey()));
        }
    }
    List<EntitlementDTO> entitlementDTOs = null;
    if (entitlements != null) {
        entitlementDTOs = new ArrayList<>();
        for (Entitlement ent : entitlements) {
            // we need to supply the compliance type for the pools
            // the method in this class does not do quantity
            addCalculatedAttributes(ent);
            entitlementDTOs.add(this.translator.translate(ent, EntitlementDTO.class));
        }
    }
    // Trigger events:
    entitler.sendEvents(entitlements);
    return Response.status(Response.Status.OK).type(MediaType.APPLICATION_JSON).entity(entitlementDTOs).build();
}
Also used : CandlepinException(org.candlepin.common.exceptions.CandlepinException) Owner(org.candlepin.model.Owner) Date(java.util.Date) AutobindDisabledForOwnerException(org.candlepin.controller.AutobindDisabledForOwnerException) JobDetail(org.quartz.JobDetail) EntitlementDTO(org.candlepin.dto.api.v1.EntitlementDTO) DeletedConsumer(org.candlepin.model.DeletedConsumer) Consumer(org.candlepin.model.Consumer) BadRequestException(org.candlepin.common.exceptions.BadRequestException) Pool(org.candlepin.model.Pool) AutobindData(org.candlepin.resource.dto.AutobindData) ConsumerType(org.candlepin.model.ConsumerType) Entitlement(org.candlepin.model.Entitlement) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Consumes(javax.ws.rs.Consumes) Produces(javax.ws.rs.Produces) ApiOperation(io.swagger.annotations.ApiOperation) ApiResponses(io.swagger.annotations.ApiResponses)

Example 27 with AutobindData

use of org.candlepin.resource.dto.AutobindData in project candlepin by candlepin.

the class ConsumerBindUtil method handleActivationKeyAutoBind.

private void handleActivationKeyAutoBind(Consumer consumer, ActivationKey key) throws AutobindDisabledForOwnerException {
    try {
        Set<String> productIds = new HashSet<>();
        List<String> poolIds = new ArrayList<>();
        for (Product akp : key.getProducts()) {
            productIds.add(akp.getId());
        }
        for (ConsumerInstalledProduct cip : consumer.getInstalledProducts()) {
            productIds.add(cip.getProductId());
        }
        for (ActivationKeyPool p : key.getPools()) {
            poolIds.add(p.getPool().getId());
        }
        Owner owner = ownerCurator.findOwnerById(consumer.getOwnerId());
        AutobindData autobindData = AutobindData.create(consumer, owner).forProducts(productIds.toArray(new String[0])).withPools(poolIds);
        List<Entitlement> ents = entitler.bindByProducts(autobindData);
        entitler.sendEvents(ents);
    } catch (ForbiddenException fe) {
        throw fe;
    } catch (CertVersionConflictException cvce) {
        throw cvce;
    } catch (RuntimeException re) {
        log.warn("Unable to attach a subscription for a product that " + "has no pool: " + re.getMessage());
    }
}
Also used : Owner(org.candlepin.model.Owner) ForbiddenException(org.candlepin.common.exceptions.ForbiddenException) ConsumerInstalledProduct(org.candlepin.model.ConsumerInstalledProduct) ArrayList(java.util.ArrayList) Product(org.candlepin.model.Product) ConsumerInstalledProduct(org.candlepin.model.ConsumerInstalledProduct) ActivationKeyPool(org.candlepin.model.activationkeys.ActivationKeyPool) CertVersionConflictException(org.candlepin.version.CertVersionConflictException) AutobindData(org.candlepin.resource.dto.AutobindData) Entitlement(org.candlepin.model.Entitlement) HashSet(java.util.HashSet)

Aggregations

AutobindData (org.candlepin.resource.dto.AutobindData)27 Test (org.junit.Test)22 Date (java.util.Date)18 Consumer (org.candlepin.model.Consumer)17 ConsumerInstalledProduct (org.candlepin.model.ConsumerInstalledProduct)16 Product (org.candlepin.model.Product)15 ArrayList (java.util.ArrayList)13 Pool (org.candlepin.model.Pool)13 Owner (org.candlepin.model.Owner)12 HashSet (java.util.HashSet)11 Entitlement (org.candlepin.model.Entitlement)10 List (java.util.List)8 ProductData (org.candlepin.model.dto.ProductData)5 LinkedList (java.util.LinkedList)4 CandlepinQuery (org.candlepin.model.CandlepinQuery)4 ValidationResult (org.candlepin.policy.ValidationResult)4 Matchers.anyString (org.mockito.Matchers.anyString)4 Set (java.util.Set)3 Page (org.candlepin.common.paging.Page)3 PageRequest (org.candlepin.common.paging.PageRequest)3