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;