RA: Add capability for Policy driven VlanTags
[ccsdk/sli/adaptors.git] / resource-assignment / provider / src / main / java / org / onap / ccsdk / sli / adaptors / ra / alloc / DbAllocationRule.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * openECOMP : SDN-C
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights
6  *                                              reserved.
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21
22 package org.onap.ccsdk.sli.adaptors.ra.alloc;
23
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.Range;
40 import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationRequest;
41 import org.onap.ccsdk.sli.adaptors.rm.data.ResourceType;
42 import org.onap.ccsdk.sli.adaptors.util.expr.ExpressionEvaluator;
43 import org.onap.ccsdk.sli.adaptors.util.str.StrUtil;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
46
47 public class DbAllocationRule implements AllocationRule {
48
49     private static final Logger log = LoggerFactory.getLogger(DbAllocationRule.class);
50
51     private ResourceRuleDao resourceRuleDao;
52     private RangeRuleDao rangeRuleDao;
53
54     @Override
55     public AllocationRequest buildAllocationRequest(String serviceModel, ResourceEntity resourceEntity,
56             ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
57         List<ResourceRule> resourceRuleList = resourceRuleDao.getResourceRules(serviceModel,
58                 resourceTarget.resourceTargetType);
59         List<RangeRule> rangeRuleList = rangeRuleDao.getRangeRules(serviceModel, resourceTarget.resourceTargetType);
60
61         List<AllocationRequest> arlist = new ArrayList<>();
62
63         for (ResourceRule rr : resourceRuleList) {
64             if (resourceRequest.resourceName != null && !resourceRequest.resourceName.equals(rr.resourceName)) {
65                 continue;
66             }
67
68             boolean matches = ExpressionEvaluator.evalBoolean(rr.serviceExpression, resourceEntity.data);
69             matches = matches && ExpressionEvaluator.evalBoolean(rr.equipmentExpression, resourceTarget.data);
70
71             if (matches) {
72                 AllocationRequest ar1 = buildAllocationRequest(rr, resourceEntity, resourceTarget, resourceRequest,
73                         checkOnly, change);
74                 arlist.add(ar1);
75             }
76         }
77
78         for (RangeRule rr : rangeRuleList) {
79             if (resourceRequest.resourceName != null && !resourceRequest.resourceName.equals(rr.rangeName)) {
80                 continue;
81             }
82             if (resourceRequest.endPointPosition != null
83                     && !resourceRequest.endPointPosition.equals(rr.endPointPosition)) {
84                 continue;
85             }
86
87             if (!ExpressionEvaluator.evalBoolean(rr.equipmentExpression, resourceTarget.data)) {
88                 continue;
89             }
90
91             AllocationRequest ar1 = buildAllocationRequest(rr, resourceEntity, resourceTarget, resourceRequest,
92                     checkOnly, change);
93             arlist.add(ar1);
94         }
95
96         if ((rangeRuleList == null || rangeRuleList.isEmpty())
97                 && ResourceType.Range.equals(resourceRequest.resourceType)) {
98             AllocationRequest ar1 = buildAllocationRequest(resourceEntity, resourceTarget, resourceRequest, checkOnly,
99                     change);
100             arlist.add(ar1);
101         }
102
103         if (arlist.isEmpty()) {
104             return null;
105         }
106
107         if (arlist.size() == 1) {
108             return arlist.get(0);
109         }
110
111         MultiResourceAllocationRequest ar = new MultiResourceAllocationRequest();
112         ar.stopOnFirstFailure = false;
113         ar.allocationRequestList = arlist;
114         return ar;
115     }
116
117     private AllocationRequest buildAllocationRequest(ResourceEntity resourceEntity, ResourceTarget resourceTarget,
118             ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
119
120         RangeAllocationRequest ar = new RangeAllocationRequest();
121         ar.applicationId = resourceRequest.applicationId;
122         if (resourceRequest.endPointPosition != null) {
123             ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId + "::"
124                     + resourceRequest.endPointPosition;
125             ar.endPointPosition = resourceRequest.endPointPosition;
126         } else {
127             ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
128         }
129         ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
130         ar.resourceName = resourceRequest.resourceName;
131         if (resourceRequest.resourceShareGroup != null) {
132             ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
133         }
134         ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
135         ar.requestedNumbers = StrUtil.listInt(resourceRequest.rangeRequestedNumbers,
136                 "Invalid value for requested-numbers");
137         if (ar.requestedNumbers != null) {
138             ar.requestedCount = ar.requestedNumbers.size();
139         }
140         ar.excludeNumbers = StrUtil.listInt(resourceRequest.rangeExcludeNumbers, "Invalid value for exclude-numbers");
141         ar.reverseOrder = resourceRequest.rangeReverseOrder;
142         ar.missingResourceAction = AllocationAction.Succeed_Allocate;
143         ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
144         ar.replace = resourceRequest.replace;
145         ar.check = true;
146         ar.allocate = !checkOnly;
147         ar.rangeList = resourceRequest.rangeOverrideList;
148         if (ar.rangeList == null || ar.rangeList.isEmpty()) {
149             if (resourceRequest.rangeMinOverride >= 0
150                     && resourceRequest.rangeMaxOverride >= resourceRequest.rangeMinOverride) {
151                 ar.rangeList = new ArrayList<>();
152                 Range range = new Range();
153                 range.min = resourceRequest.rangeMinOverride;
154                 range.max = resourceRequest.rangeMaxOverride;
155                 ar.rangeList.add(range);
156             }
157         } else {
158             if (resourceRequest.rangeMinOverride >= 0) {
159                 ar.rangeList.get(0).min = resourceRequest.rangeMinOverride;
160             }
161             if (resourceRequest.rangeMaxOverride >= 0) {
162                 ar.rangeList.get(ar.rangeList.size() - 1).max = resourceRequest.rangeMaxOverride;
163             }
164         }
165         ar.forceNewNumbers = resourceRequest.rangeForceNewNumbers;
166         StrUtil.info(log, ar);
167         return ar;
168     }
169
170     private AllocationRequest buildAllocationRequest(ResourceRule resourceRule, ResourceEntity resourceEntity,
171             ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
172         StrUtil.info(log, resourceRule);
173
174         LimitAllocationRequest ar = new LimitAllocationRequest();
175         ar.applicationId = resourceRequest.applicationId;
176         ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
177         ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
178         ar.resourceName = resourceRule.resourceName;
179         if (resourceRequest.resourceShareGroup != null) {
180             ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
181         }
182         ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
183         ar.missingResourceAction = AllocationAction.Succeed_Allocate;
184         ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
185         ar.replace = resourceRequest.replace;
186         ar.strict = false;
187         ar.checkLimit = ExpressionEvaluator.evalLong(
188                 change ? resourceRule.hardLimitExpression : resourceRule.softLimitExpression, resourceTarget.data);
189         ar.checkCount = ExpressionEvaluator.evalLong(resourceRule.allocationExpression, resourceEntity.data);
190         ar.allocateCount = checkOnly ? 0 : ar.checkCount;
191         return ar;
192     }
193
194     private AllocationRequest buildAllocationRequest(RangeRule rangeRule, ResourceEntity resourceEntity,
195             ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
196         StrUtil.info(log, rangeRule);
197
198         RangeAllocationRequest ar = new RangeAllocationRequest();
199         ar.applicationId = resourceRequest.applicationId;
200         if (resourceRequest.endPointPosition != null) {
201             ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId + "::"
202                     + resourceRequest.endPointPosition;
203             ar.endPointPosition = resourceRequest.endPointPosition;
204         } else {
205             ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
206         }
207         ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
208         ar.resourceName = rangeRule.rangeName;
209         if (resourceRequest.resourceShareGroup != null) {
210             ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
211         }
212         ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
213         ar.requestedNumbers = StrUtil.listInt(resourceRequest.rangeRequestedNumbers,
214                 "Invalid value for requested-numbers");
215         if (ar.requestedNumbers != null) {
216             ar.requestedCount = ar.requestedNumbers.size();
217         }
218         ar.excludeNumbers = StrUtil.listInt(resourceRequest.rangeExcludeNumbers, "Invalid value for exclude-numbers");
219         ar.reverseOrder = resourceRequest.rangeReverseOrder;
220         ar.missingResourceAction = AllocationAction.Succeed_Allocate;
221         ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
222         ar.replace = resourceRequest.replace;
223         ar.check = true;
224         ar.allocate = !checkOnly;
225         ar.rangeList = rangeRule.rangeList;
226         if (ar.rangeList == null || ar.rangeList.isEmpty()) {
227             if (resourceRequest.rangeMinOverride >= 0
228                     && resourceRequest.rangeMaxOverride >= resourceRequest.rangeMinOverride) {
229                 ar.rangeList = new ArrayList<>();
230                 Range range = new Range();
231                 range.min = resourceRequest.rangeMinOverride;
232                 range.max = resourceRequest.rangeMaxOverride;
233                 ar.rangeList.add(range);
234             }
235         } else {
236             if (resourceRequest.rangeMinOverride >= 0) {
237                 ar.rangeList.get(0).min = resourceRequest.rangeMinOverride;
238             }
239             if (resourceRequest.rangeMaxOverride >= 0) {
240                 ar.rangeList.get(ar.rangeList.size() - 1).max = resourceRequest.rangeMaxOverride;
241             }
242
243         }
244         ar.forceNewNumbers = resourceRequest.rangeForceNewNumbers;
245         return ar;
246     }
247
248     public void setResourceRuleDao(ResourceRuleDao resourceRuleDao) {
249         this.resourceRuleDao = resourceRuleDao;
250     }
251
252     public void setRangeRuleDao(RangeRuleDao rangeRuleDao) {
253         this.rangeRuleDao = rangeRuleDao;
254     }
255 }