Search in sources :

Example 6 with JsonJsContext

use of org.candlepin.policy.js.JsonJsContext in project candlepin by candlepin.

the class EntitlementRules method preEntitlement.

@Override
@SuppressWarnings("checkstyle:indentation")
public Map<String, ValidationResult> preEntitlement(Consumer consumer, Consumer host, Collection<PoolQuantity> entitlementPoolQuantities, CallerType caller) {
    Map<String, ValidationResult> resultMap = new HashMap<>();
    ConsumerType ctype = this.consumerTypeCurator.getConsumerType(consumer);
    /* This document describes the java script portion of the pre entitlement rules check:
         * http://www.candlepinproject.org/docs/candlepin/pre_entitlement_rules_check.html
         * As described in the document, none of the checks are related to share binds, so we
         * skip that step for share consumers.
         */
    if (!ctype.isType(ConsumerTypeEnum.SHARE)) {
        Stream<EntitlementDTO> entStream = consumer.getEntitlements() == null ? Stream.empty() : consumer.getEntitlements().stream().map(this.translator.getStreamMapper(Entitlement.class, EntitlementDTO.class));
        JsonJsContext args = new JsonJsContext(objectMapper);
        args.put("consumer", this.translator.translate(consumer, ConsumerDTO.class));
        args.put("hostConsumer", this.translator.translate(host, ConsumerDTO.class));
        args.put("consumerEntitlements", entStream.collect(Collectors.toSet()));
        args.put("standalone", config.getBoolean(ConfigProperties.STANDALONE));
        args.put("poolQuantities", entitlementPoolQuantities);
        args.put("caller", caller.getLabel());
        args.put("log", log, false);
        String json = jsRules.runJsFunction(String.class, "validate_pools_batch", args);
        TypeReference<Map<String, ValidationResult>> typeref = new TypeReference<Map<String, ValidationResult>>() {
        };
        try {
            resultMap = objectMapper.toObject(json, typeref);
            for (PoolQuantity poolQuantity : entitlementPoolQuantities) {
                if (!resultMap.containsKey(poolQuantity.getPool().getId())) {
                    resultMap.put(poolQuantity.getPool().getId(), new ValidationResult());
                    log.info("no result returned for pool: {}", poolQuantity.getPool());
                }
            }
        } catch (Exception e) {
            throw new RuleExecutionException(e);
        }
    }
    for (PoolQuantity poolQuantity : entitlementPoolQuantities) {
        if (ctype.isType(ConsumerTypeEnum.SHARE)) {
            ValidationResult result = new ValidationResult();
            resultMap.put(poolQuantity.getPool().getId(), result);
            validatePoolSharingEligibility(result, poolQuantity.getPool());
        }
        finishValidation(resultMap.get(poolQuantity.getPool().getId()), poolQuantity.getPool(), poolQuantity.getQuantity());
    }
    return resultMap;
}
Also used : PoolQuantity(org.candlepin.model.PoolQuantity) HashMap(java.util.HashMap) ValidationResult(org.candlepin.policy.ValidationResult) RuleExecutionException(org.candlepin.policy.js.RuleExecutionException) EntitlementDTO(org.candlepin.dto.rules.v1.EntitlementDTO) ConsumerDTO(org.candlepin.dto.rules.v1.ConsumerDTO) JsonJsContext(org.candlepin.policy.js.JsonJsContext) TypeReference(com.fasterxml.jackson.core.type.TypeReference) RuleExecutionException(org.candlepin.policy.js.RuleExecutionException) ConsumerType(org.candlepin.model.ConsumerType) Map(java.util.Map) HashMap(java.util.HashMap)

Example 7 with JsonJsContext

use of org.candlepin.policy.js.JsonJsContext in project candlepin by candlepin.

the class AutobindRules method selectBestPools.

public List<PoolQuantity> selectBestPools(Consumer consumer, String[] productIds, List<Pool> pools, ComplianceStatus compliance, String serviceLevelOverride, Set<String> exemptLevels, boolean considerDerived) {
    List<PoolQuantity> bestPools = new ArrayList<>();
    int poolsBeforeContentFilter = pools.size();
    pools = filterPoolsForV1Certificates(consumer, pools);
    log.debug("pools.size() before V1 certificate filter: {}, after: {}", poolsBeforeContentFilter, pools.size());
    if (pools.size() == 0) {
        if (compliance.getReasons().size() == 0) {
            log.info("Consumer is compliant and does not require more entitlements.");
        } else {
            logProducts("No pools available to complete compliance for the set of products: {}" + " and consumer installed products: {}", productIds, consumer, false);
        }
        return bestPools;
    }
    if (log.isDebugEnabled()) {
        logProducts("Selecting best entitlement pool for products: {}" + "and consumer installed products: {}", productIds, consumer, true);
        if (poolsBeforeContentFilter != pools.size()) {
            log.debug("{} pools filtered due to too much content", (poolsBeforeContentFilter - pools.size()));
        }
    }
    List<PoolDTO> poolDTOs = new ArrayList<>();
    for (Pool pool : pools) {
        poolDTOs.add(this.translator.translate(pool, PoolDTO.class));
    }
    // Provide objects for the script:
    JsonJsContext args = new JsonJsContext(mapper);
    args.put("consumer", this.translator.translate(consumer, ConsumerDTO.class));
    Owner owner = ownerCurator.findOwnerById(consumer.getOwnerId());
    args.put("owner", this.translator.translate(owner, OwnerDTO.class));
    args.put("serviceLevelOverride", serviceLevelOverride);
    args.put("pools", poolDTOs.toArray());
    args.put("products", productIds);
    args.put("log", log, false);
    args.put("compliance", compliance);
    args.put("exemptList", exemptLevels);
    args.put("considerDerived", considerDerived);
    args.put("guestIds", consumer.getGuestIds());
    // Convert the JSON returned into a Map object:
    Map<String, Integer> result = null;
    try {
        String json = jsRules.invokeMethod(SELECT_POOL_FUNCTION, args);
        result = mapper.toObject(json, Map.class);
        if (log.isDebugEnabled()) {
            log.debug("Executed javascript rule: {}", SELECT_POOL_FUNCTION);
        }
    } catch (NoSuchMethodException e) {
        log.warn("No method found: {}", SELECT_POOL_FUNCTION);
        log.warn("Resorting to default pool selection behavior.");
        return selectBestPoolDefault(pools);
    } catch (RhinoException e) {
        throw new RuleExecutionException(e);
    }
    if (pools.size() > 0 && (result == null || result.isEmpty())) {
        logProducts("Rules did not select a pool for products: {} and consumer installed products: {}", productIds, consumer, false);
        return bestPools;
    }
    for (Pool p : pools) {
        for (Entry<String, Integer> entry : result.entrySet()) {
            if (p.getId().equals(entry.getKey())) {
                log.debug("Best pool: {}", p);
                int quantity = entry.getValue();
                bestPools.add(new PoolQuantity(p, quantity));
            }
        }
    }
    return bestPools;
}
Also used : PoolQuantity(org.candlepin.model.PoolQuantity) Owner(org.candlepin.model.Owner) ArrayList(java.util.ArrayList) PoolDTO(org.candlepin.dto.rules.v1.PoolDTO) ConsumerDTO(org.candlepin.dto.rules.v1.ConsumerDTO) OwnerDTO(org.candlepin.dto.rules.v1.OwnerDTO) Pool(org.candlepin.model.Pool) JsonJsContext(org.candlepin.policy.js.JsonJsContext) RhinoException(org.mozilla.javascript.RhinoException) RuleExecutionException(org.candlepin.policy.js.RuleExecutionException) Map(java.util.Map)

Example 8 with JsonJsContext

use of org.candlepin.policy.js.JsonJsContext in project candlepin by candlepin.

the class ComplianceRules method isStackCompliant.

@SuppressWarnings("checkstyle:indentation")
public boolean isStackCompliant(Consumer consumer, String stackId, List<Entitlement> entsToConsider) {
    Stream<EntitlementDTO> entStream = entsToConsider == null ? Stream.empty() : entsToConsider.stream().map(this.translator.getStreamMapper(Entitlement.class, EntitlementDTO.class));
    JsonJsContext args = new JsonJsContext(mapper);
    args.put("stack_id", stackId);
    args.put("consumer", this.translator.translate(consumer, ConsumerDTO.class));
    args.put("entitlements", entStream.collect(Collectors.toSet()));
    args.put("log", log, false);
    args.put("guestIds", consumer.getGuestIds());
    return jsRules.runJsFunction(Boolean.class, "is_stack_compliant", args);
}
Also used : EntitlementDTO(org.candlepin.dto.rules.v1.EntitlementDTO) ConsumerDTO(org.candlepin.dto.rules.v1.ConsumerDTO) JsonJsContext(org.candlepin.policy.js.JsonJsContext)

Example 9 with JsonJsContext

use of org.candlepin.policy.js.JsonJsContext in project candlepin by candlepin.

the class ComplianceRules method getStatus.

/**
 * Check compliance status for a consumer on a specific date.
 *
 * @param consumer Consumer to check.
 * @param date Date to check compliance status for.
 * @param calculateCompliantUntil calculate how long the system will remain compliant (expensive)
 * @param updateConsumer whether or not to use consumerCurator.update
 * @param calculateProductComplianceDateRanges calculate the individual compliance ranges for each product
 *        (also expensive)
 * @return Compliance status.
 */
@SuppressWarnings("checkstyle:indentation")
public ComplianceStatus getStatus(Consumer consumer, Collection<Entitlement> newEntitlements, Date date, boolean calculateCompliantUntil, boolean updateConsumer, boolean calculateProductComplianceDateRanges, boolean currentCompliance) {
    if (date == null) {
        date = new Date();
    }
    if (currentCompliance) {
        updateEntsOnStart(consumer);
    }
    Stream<EntitlementDTO> entStream = Stream.concat(newEntitlements != null ? newEntitlements.stream() : Stream.empty(), consumer.getEntitlements() != null ? consumer.getEntitlements().stream() : Stream.empty()).map(this.translator.getStreamMapper(Entitlement.class, EntitlementDTO.class));
    // Do not calculate compliance status for distributors and shares. It is prohibitively
    // expensive and meaningless
    ConsumerType ctype = this.consumerTypeCurator.getConsumerType(consumer);
    if (ctype != null && (ctype.isManifest() || ctype.isType(ConsumerTypeEnum.SHARE))) {
        return new ComplianceStatus(new Date());
    }
    JsonJsContext args = new JsonJsContext(mapper);
    args.put("consumer", this.translator.translate(consumer, ConsumerDTO.class));
    args.put("entitlements", entStream.collect(Collectors.toSet()));
    args.put("ondate", date);
    args.put("calculateCompliantUntil", calculateCompliantUntil);
    args.put("calculateProductComplianceDateRanges", calculateProductComplianceDateRanges);
    args.put("log", log, false);
    args.put("guestIds", consumer.getGuestIds());
    // Convert the JSON returned into a ComplianceStatus object:
    String json = jsRules.runJsFunction(String.class, "get_status", args);
    try {
        ComplianceStatus status = mapper.toObject(json, ComplianceStatus.class);
        for (ComplianceReason reason : status.getReasons()) {
            generator.setMessage(consumer, reason, status.getDate());
        }
        if (currentCompliance) {
            applyStatus(consumer, status, updateConsumer);
        }
        return status;
    } catch (Exception e) {
        throw new RuleExecutionException(e);
    }
}
Also used : EntitlementDTO(org.candlepin.dto.rules.v1.EntitlementDTO) ConsumerDTO(org.candlepin.dto.rules.v1.ConsumerDTO) JsonJsContext(org.candlepin.policy.js.JsonJsContext) RuleExecutionException(org.candlepin.policy.js.RuleExecutionException) Entitlement(org.candlepin.model.Entitlement) ConsumerType(org.candlepin.model.ConsumerType) Date(java.util.Date) RuleExecutionException(org.candlepin.policy.js.RuleExecutionException)

Example 10 with JsonJsContext

use of org.candlepin.policy.js.JsonJsContext in project candlepin by candlepin.

the class ActivationKeyRules method runPreActKey.

public ValidationResult runPreActKey(ActivationKey key, Pool pool, Long quantity) {
    JsonJsContext args = new JsonJsContext(mapper);
    args.put("key", key);
    args.put("pool", this.translator.translate(pool, PoolDTO.class));
    args.put("quantity", quantity);
    args.put("log", log, false);
    String json = jsRules.invokeRule("validate_pool", args);
    return mapper.toObject(json, ValidationResult.class);
}
Also used : PoolDTO(org.candlepin.dto.rules.v1.PoolDTO) JsonJsContext(org.candlepin.policy.js.JsonJsContext)

Aggregations

JsonJsContext (org.candlepin.policy.js.JsonJsContext)10 ConsumerDTO (org.candlepin.dto.rules.v1.ConsumerDTO)8 EntitlementDTO (org.candlepin.dto.rules.v1.EntitlementDTO)7 PoolDTO (org.candlepin.dto.rules.v1.PoolDTO)5 RuleExecutionException (org.candlepin.policy.js.RuleExecutionException)5 Map (java.util.Map)4 TypeReference (com.fasterxml.jackson.core.type.TypeReference)3 ConsumerType (org.candlepin.model.ConsumerType)3 HashMap (java.util.HashMap)2 Entitlement (org.candlepin.model.Entitlement)2 Pool (org.candlepin.model.Pool)2 PoolQuantity (org.candlepin.model.PoolQuantity)2 ValidationResult (org.candlepin.policy.ValidationResult)2 ArrayList (java.util.ArrayList)1 Date (java.util.Date)1 LinkedList (java.util.LinkedList)1 OwnerDTO (org.candlepin.dto.rules.v1.OwnerDTO)1 Owner (org.candlepin.model.Owner)1 RhinoException (org.mozilla.javascript.RhinoException)1