2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
 
   7  * ================================================================================
 
   8  * Licensed under the Apache License, Version 2.0 (the "License");
 
   9  * you may not use this file except in compliance with the License.
 
  10  * You may obtain a copy of the License at
 
  12  *      http://www.apache.org/licenses/LICENSE-2.0
 
  14  * Unless required by applicable law or agreed to in writing, software
 
  15  * distributed under the License is distributed on an "AS IS" BASIS,
 
  16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  17  * See the License for the specific language governing permissions and
 
  18  * limitations under the License.
 
  19  * ============LICENSE_END=========================================================
 
  22 package org.onap.ccsdk.sli.adaptors.ra.alloc;
 
  24 import java.util.ArrayList;
 
  25 import java.util.Collections;
 
  26 import java.util.List;
 
  27 import org.onap.ccsdk.sli.adaptors.ra.comp.AllocationRule;
 
  28 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceEntity;
 
  29 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceRequest;
 
  30 import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceTarget;
 
  31 import org.onap.ccsdk.sli.adaptors.ra.rule.dao.RangeRuleDao;
 
  32 import org.onap.ccsdk.sli.adaptors.ra.rule.dao.ResourceRuleDao;
 
  33 import org.onap.ccsdk.sli.adaptors.ra.rule.data.RangeRule;
 
  34 import org.onap.ccsdk.sli.adaptors.ra.rule.data.ResourceRule;
 
  35 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationAction;
 
  36 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationRequest;
 
  37 import org.onap.ccsdk.sli.adaptors.rm.data.LimitAllocationRequest;
 
  38 import org.onap.ccsdk.sli.adaptors.rm.data.MultiResourceAllocationRequest;
 
  39 import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationRequest;
 
  40 import org.onap.ccsdk.sli.adaptors.util.expr.ExpressionEvaluator;
 
  41 import org.onap.ccsdk.sli.adaptors.util.str.StrUtil;
 
  42 import org.slf4j.Logger;
 
  43 import org.slf4j.LoggerFactory;
 
  45 public class DbAllocationRule implements AllocationRule {
 
  47         private static final Logger log = LoggerFactory.getLogger(DbAllocationRule.class);
 
  49         private ResourceRuleDao resourceRuleDao;
 
  50         private RangeRuleDao rangeRuleDao;
 
  53         public AllocationRequest buildAllocationRequest(String serviceModel, ResourceEntity resourceEntity,
 
  54                         ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
 
  55                 List<ResourceRule> resourceRuleList = resourceRuleDao.getResourceRules(serviceModel,
 
  56                                 resourceTarget.resourceTargetType);
 
  57                 List<RangeRule> rangeRuleList = rangeRuleDao.getRangeRules(serviceModel, resourceTarget.resourceTargetType);
 
  59                 List<AllocationRequest> arlist = new ArrayList<>();
 
  61                 for (ResourceRule rr : resourceRuleList) {
 
  62                         if (resourceRequest.resourceName != null && !resourceRequest.resourceName.equals(rr.resourceName)) {
 
  66                         boolean matches = ExpressionEvaluator.evalBoolean(rr.serviceExpression, resourceEntity.data);
 
  67                         matches = matches && ExpressionEvaluator.evalBoolean(rr.equipmentExpression, resourceTarget.data);
 
  70                                 AllocationRequest ar1 = buildAllocationRequest(rr, resourceEntity, resourceTarget, resourceRequest,
 
  76                 for (RangeRule rr : rangeRuleList) {
 
  77                         if (resourceRequest.resourceName != null && !resourceRequest.resourceName.equals(rr.rangeName)) {
 
  80                         if (resourceRequest.endPointPosition != null
 
  81                                         && !resourceRequest.endPointPosition.equals(rr.endPointPosition)) {
 
  85                         AllocationRequest ar1 = buildAllocationRequest(rr, resourceEntity, resourceTarget, resourceRequest,
 
  90                 if (arlist.isEmpty()) {
 
  94                 if (arlist.size() == 1) {
 
  98                 MultiResourceAllocationRequest ar = new MultiResourceAllocationRequest();
 
  99                 ar.stopOnFirstFailure = false;
 
 100                 ar.allocationRequestList = arlist;
 
 104         private AllocationRequest buildAllocationRequest(ResourceRule resourceRule, ResourceEntity resourceEntity,
 
 105                         ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
 
 106                 StrUtil.info(log, resourceRule);
 
 108                 LimitAllocationRequest ar = new LimitAllocationRequest();
 
 109                 ar.applicationId = resourceRequest.applicationId;
 
 110                 ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
 
 111                 ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
 
 112                 ar.resourceName = resourceRule.resourceName;
 
 113                 if (resourceRequest.resourceShareGroup != null) {
 
 114                         ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
 
 116                 ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
 
 117                 ar.missingResourceAction = AllocationAction.Succeed_Allocate;
 
 118                 ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
 
 119                 ar.replace = resourceRequest.replace;
 
 121                 ar.checkLimit = ExpressionEvaluator.evalLong(
 
 122                                 change ? resourceRule.hardLimitExpression : resourceRule.softLimitExpression, resourceTarget.data);
 
 123                 ar.checkCount = ExpressionEvaluator.evalLong(resourceRule.allocationExpression, resourceEntity.data);
 
 124                 ar.allocateCount = checkOnly ? 0 : ar.checkCount;
 
 128         private AllocationRequest buildAllocationRequest(RangeRule rangeRule, ResourceEntity resourceEntity,
 
 129                         ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
 
 130                 StrUtil.info(log, rangeRule);
 
 132                 RangeAllocationRequest ar = new RangeAllocationRequest();
 
 133                 ar.applicationId = resourceRequest.applicationId;
 
 134                 if (resourceRequest.endPointPosition != null) {
 
 135                         ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId + "::"
 
 136                                         + resourceRequest.endPointPosition;
 
 137                         ar.endPointPosition = resourceRequest.endPointPosition;
 
 139                         ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
 
 140                 ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
 
 141                 ar.resourceName = rangeRule.rangeName;
 
 142                 if (resourceRequest.resourceShareGroup != null) {
 
 143                         ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
 
 145                 ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
 
 146                 ar.requestedNumbers = StrUtil.listInt(resourceRequest.rangeRequestedNumbers,
 
 147                                 "Invalid value for requested-numbers");
 
 148                 if (ar.requestedNumbers != null) {
 
 149                         ar.requestedCount = ar.requestedNumbers.size();
 
 151                 ar.excludeNumbers = StrUtil.listInt(resourceRequest.rangeExcludeNumbers, "Invalid value for exclude-numbers");
 
 152                 ar.reverseOrder = resourceRequest.rangeReverseOrder;
 
 153                 ar.missingResourceAction = AllocationAction.Succeed_Allocate;
 
 154                 ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
 
 155                 ar.replace = resourceRequest.replace;
 
 157                 ar.allocate = !checkOnly;
 
 158                 ar.checkMin = resourceRequest.rangeMinOverride >= 0 ? resourceRequest.rangeMinOverride : rangeRule.minValue;
 
 159                 ar.checkMax = resourceRequest.rangeMaxOverride >= 0 ? resourceRequest.rangeMaxOverride : rangeRule.maxValue;
 
 163         public void setResourceRuleDao(ResourceRuleDao resourceRuleDao) {
 
 164                 this.resourceRuleDao = resourceRuleDao;
 
 167         public void setRangeRuleDao(RangeRuleDao rangeRuleDao) {
 
 168                 this.rangeRuleDao = rangeRuleDao;