[CCSDK-245] RA: Refactor RA to make it generic
[ccsdk/sli/adaptors.git] / resource-assignment / provider / src / main / java / org / onap / ccsdk / sli / adaptors / ra / alloc / DbAllocationRule.java
index a0b698d..e9f6e0d 100644 (file)
@@ -3,14 +3,14 @@
  * openECOMP : SDN-C
  * ================================================================================
  * Copyright (C) 2017 AT&T Intellectual Property. All rights
- *                         reserved.
+ *                                             reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -24,10 +24,10 @@ package org.onap.ccsdk.sli.adaptors.ra.alloc;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-
 import org.onap.ccsdk.sli.adaptors.ra.comp.AllocationRule;
-import org.onap.ccsdk.sli.adaptors.ra.comp.ServiceData;
-import org.onap.ccsdk.sli.adaptors.ra.equip.data.EquipmentData;
+import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceEntity;
+import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceRequest;
+import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceTarget;
 import org.onap.ccsdk.sli.adaptors.ra.rule.dao.RangeRuleDao;
 import org.onap.ccsdk.sli.adaptors.ra.rule.dao.ResourceRuleDao;
 import org.onap.ccsdk.sli.adaptors.ra.rule.data.RangeRule;
@@ -44,112 +44,127 @@ import org.slf4j.LoggerFactory;
 
 public class DbAllocationRule implements AllocationRule {
 
-    private static final Logger log = LoggerFactory.getLogger(DbAllocationRule.class);
-
-    private ResourceRuleDao resourceRuleDao;
-    private RangeRuleDao rangeRuleDao;
-
-    @Override
-    public AllocationRequest buildAllocationRequest(
-            String resourceUnionId,
-            String resourceSetId,
-            String endPointPosition,
-            ServiceData serviceData,
-            EquipmentData equipmentData,
-            boolean checkOnly,
-            boolean change) {
-        List<ResourceRule> resourceRuleList = resourceRuleDao.getResourceRules(serviceData.serviceModel,
-                endPointPosition, equipmentData.equipmentLevel);
-        List<RangeRule> rangeRuleList =
-                rangeRuleDao.getRangeRules(serviceData.serviceModel, endPointPosition, equipmentData.equipmentLevel);
-
-        List<AllocationRequest> arlist = new ArrayList<AllocationRequest>();
-
-        for (ResourceRule rr : resourceRuleList) {
-            if (serviceData.resourceName != null && !serviceData.resourceName.equals(rr.resourceName))
-                continue;
-            AllocationRequest ar1 = buildAllocationRequest(rr, resourceUnionId, resourceSetId, serviceData,
-                    equipmentData, checkOnly, change);
-            arlist.add(ar1);
-        }
-        for (RangeRule rr : rangeRuleList) {
-            if (serviceData.resourceName != null && !serviceData.resourceName.equals(rr.rangeName))
-                continue;
-            AllocationRequest ar1 = buildAllocationRequest(rr, resourceUnionId, resourceSetId, serviceData,
-                    equipmentData, checkOnly, change);
-            arlist.add(ar1);
-        }
-
-        if (arlist.isEmpty())
-            return null;
-
-        if (arlist.size() == 1)
-            return arlist.get(0);
-
-        MultiResourceAllocationRequest ar = new MultiResourceAllocationRequest();
-        ar.stopOnFirstFailure = false;
-        ar.allocationRequestList = arlist;
-        return ar;
-    }
-
-    private AllocationRequest buildAllocationRequest(
-            ResourceRule resourceRule,
-            String resourceUnionId,
-            String resourceSetId,
-            ServiceData serviceData,
-            EquipmentData equipmentData,
-            boolean checkOnly,
-            boolean change) {
-        StrUtil.info(log, resourceRule);
-
-        LimitAllocationRequest ar = new LimitAllocationRequest();
-        ar.resourceSetId = resourceSetId;
-        ar.resourceUnionId = resourceUnionId;
-        ar.resourceName = resourceRule.resourceName;
-        if (serviceData.resourceShareGroup != null)
-            ar.resourceShareGroupList = Collections.singleton(serviceData.resourceShareGroup);
-        ar.assetId = equipmentData.equipmentId;
-        ar.missingResourceAction = AllocationAction.Succeed_Allocate;
-        ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
-        ar.replace = true;
-        ar.strict = false;
-        ar.checkLimit = ExpressionEvaluator.evalLong(
-                change ? resourceRule.hardLimitExpression : resourceRule.softLimitExpression, equipmentData.data);;
-        ar.checkCount = ExpressionEvaluator.evalLong(resourceRule.allocationExpression, serviceData.data);
-        ar.allocateCount = checkOnly ? 0 : ar.checkCount;
-        return ar;
-    }
-
-    private AllocationRequest buildAllocationRequest(
-            RangeRule rangeRule,
-            String resourceUnionId,
-            String resourceSetId,
-            ServiceData serviceData,
-            EquipmentData equipmentData,
-            boolean checkOnly,
-            boolean change) {
-        StrUtil.info(log, rangeRule);
-
-        RangeAllocationRequest ar = new RangeAllocationRequest();
-        ar.resourceSetId = resourceSetId;
-        ar.resourceUnionId = resourceUnionId;
-        ar.resourceName = rangeRule.rangeName;
-        ar.assetId = equipmentData.equipmentId;
-        ar.missingResourceAction = AllocationAction.Succeed_Allocate;
-        ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
-        ar.replace = true;
-        ar.check = true;
-        ar.allocate = !checkOnly;
-        ar.checkMin = rangeRule.minValue;
-        ar.checkMax = rangeRule.maxValue;
-        return ar;
-    }
-
-    public void setResourceRuleDao(ResourceRuleDao resourceRuleDao) {
-        this.resourceRuleDao = resourceRuleDao;
-    }
-
-    public void setRangeRuleDao(RangeRuleDao rangeRuleDao) {
-        this.rangeRuleDao = rangeRuleDao;
-    }
+       private static final Logger log = LoggerFactory.getLogger(DbAllocationRule.class);
+
+       private ResourceRuleDao resourceRuleDao;
+       private RangeRuleDao rangeRuleDao;
+
+       @Override
+       public AllocationRequest buildAllocationRequest(String serviceModel, ResourceEntity resourceEntity,
+                       ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
+               List<ResourceRule> resourceRuleList = resourceRuleDao.getResourceRules(serviceModel,
+                               resourceTarget.resourceTargetType);
+               List<RangeRule> rangeRuleList = rangeRuleDao.getRangeRules(serviceModel, resourceTarget.resourceTargetType);
+
+               List<AllocationRequest> arlist = new ArrayList<>();
+
+               for (ResourceRule rr : resourceRuleList) {
+                       if (resourceRequest.resourceName != null && !resourceRequest.resourceName.equals(rr.resourceName)) {
+                               continue;
+                       }
+
+                       boolean matches = ExpressionEvaluator.evalBoolean(rr.serviceExpression, resourceEntity.data);
+                       matches = matches && ExpressionEvaluator.evalBoolean(rr.equipmentExpression, resourceTarget.data);
+
+                       if (matches) {
+                               AllocationRequest ar1 = buildAllocationRequest(rr, resourceEntity, resourceTarget, resourceRequest,
+                                               checkOnly, change);
+                               arlist.add(ar1);
+                       }
+               }
+
+               for (RangeRule rr : rangeRuleList) {
+                       if (resourceRequest.resourceName != null && !resourceRequest.resourceName.equals(rr.rangeName)) {
+                               continue;
+                       }
+                       if (resourceRequest.endPointPosition != null
+                                       && !resourceRequest.endPointPosition.equals(rr.endPointPosition)) {
+                               continue;
+                       }
+
+                       AllocationRequest ar1 = buildAllocationRequest(rr, resourceEntity, resourceTarget, resourceRequest,
+                                       checkOnly, change);
+                       arlist.add(ar1);
+               }
+
+               if (arlist.isEmpty()) {
+                       return null;
+               }
+
+               if (arlist.size() == 1) {
+                       return arlist.get(0);
+               }
+
+               MultiResourceAllocationRequest ar = new MultiResourceAllocationRequest();
+               ar.stopOnFirstFailure = false;
+               ar.allocationRequestList = arlist;
+               return ar;
+       }
+
+       private AllocationRequest buildAllocationRequest(ResourceRule resourceRule, ResourceEntity resourceEntity,
+                       ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
+               StrUtil.info(log, resourceRule);
+
+               LimitAllocationRequest ar = new LimitAllocationRequest();
+               ar.applicationId = resourceRequest.applicationId;
+               ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
+               ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
+               ar.resourceName = resourceRule.resourceName;
+               if (resourceRequest.resourceShareGroup != null) {
+                       ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
+               }
+               ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
+               ar.missingResourceAction = AllocationAction.Succeed_Allocate;
+               ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
+               ar.replace = resourceRequest.replace;
+               ar.strict = false;
+               ar.checkLimit = ExpressionEvaluator.evalLong(
+                               change ? resourceRule.hardLimitExpression : resourceRule.softLimitExpression, resourceTarget.data);
+               ar.checkCount = ExpressionEvaluator.evalLong(resourceRule.allocationExpression, resourceEntity.data);
+               ar.allocateCount = checkOnly ? 0 : ar.checkCount;
+               return ar;
+       }
+
+       private AllocationRequest buildAllocationRequest(RangeRule rangeRule, ResourceEntity resourceEntity,
+                       ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
+               StrUtil.info(log, rangeRule);
+
+               RangeAllocationRequest ar = new RangeAllocationRequest();
+               ar.applicationId = resourceRequest.applicationId;
+               if (resourceRequest.endPointPosition != null) {
+                       ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId + "::"
+                                       + resourceRequest.endPointPosition;
+                       ar.endPointPosition = resourceRequest.endPointPosition;
+               }else
+                       ar.resourceUnionId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId;
+               ar.resourceSetId = ar.resourceUnionId + "::" + resourceEntity.resourceEntityVersion;
+               ar.resourceName = rangeRule.rangeName;
+               if (resourceRequest.resourceShareGroup != null) {
+                       ar.resourceShareGroupList = Collections.singleton(resourceRequest.resourceShareGroup);
+               }
+               ar.assetId = resourceTarget.resourceTargetType + "::" + resourceTarget.resourceTargetId;
+               ar.requestedNumbers = StrUtil.listInt(resourceRequest.rangeRequestedNumbers,
+                               "Invalid value for requested-numbers");
+               if (ar.requestedNumbers != null) {
+                       ar.requestedCount = ar.requestedNumbers.size();
+               }
+               ar.excludeNumbers = StrUtil.listInt(resourceRequest.rangeExcludeNumbers, "Invalid value for exclude-numbers");
+               ar.reverseOrder = resourceRequest.rangeReverseOrder;
+               ar.missingResourceAction = AllocationAction.Succeed_Allocate;
+               ar.expiredResourceAction = AllocationAction.Succeed_Allocate;
+               ar.replace = resourceRequest.replace;
+               ar.check = true;
+               ar.allocate = !checkOnly;
+               ar.checkMin = resourceRequest.rangeMinOverride >= 0 ? resourceRequest.rangeMinOverride : rangeRule.minValue;
+               ar.checkMax = resourceRequest.rangeMaxOverride >= 0 ? resourceRequest.rangeMaxOverride : rangeRule.maxValue;
+               return ar;
+       }
+
+       public void setResourceRuleDao(ResourceRuleDao resourceRuleDao) {
+               this.resourceRuleDao = resourceRuleDao;
+       }
+
+       public void setRangeRuleDao(RangeRuleDao rangeRuleDao) {
+               this.rangeRuleDao = rangeRuleDao;
+       }
 }