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.comp;
 
  24 import java.util.ArrayList;
 
  25 import java.util.Collections;
 
  26 import java.util.Date;
 
  27 import java.util.HashMap;
 
  28 import java.util.List;
 
  30 import org.onap.ccsdk.sli.adaptors.rm.comp.ResourceManager;
 
  31 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationItem;
 
  32 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationOutcome;
 
  33 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationRequest;
 
  34 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationStatus;
 
  35 import org.onap.ccsdk.sli.adaptors.rm.data.LimitAllocationItem;
 
  36 import org.onap.ccsdk.sli.adaptors.rm.data.LimitAllocationOutcome;
 
  37 import org.onap.ccsdk.sli.adaptors.rm.data.LimitResource;
 
  38 import org.onap.ccsdk.sli.adaptors.rm.data.MultiResourceAllocationOutcome;
 
  39 import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationItem;
 
  40 import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationOutcome;
 
  41 import org.onap.ccsdk.sli.adaptors.rm.data.RangeResource;
 
  42 import org.onap.ccsdk.sli.adaptors.rm.data.Resource;
 
  43 import org.onap.ccsdk.sli.adaptors.util.str.StrUtil;
 
  44 import org.slf4j.Logger;
 
  45 import org.slf4j.LoggerFactory;
 
  47 public class EndPointAllocatorImpl implements EndPointAllocator {
 
  49     @SuppressWarnings("unused")
 
  50     private static final Logger log = LoggerFactory.getLogger(EndPointAllocatorImpl.class);
 
  52     private ResourceManager resourceManager;
 
  54     private Map<String, List<AllocationRule>> allocationRuleMap;
 
  57     public List<ResourceData> allocateResources(String serviceModel, ResourceEntity resourceEntity,
 
  58             ResourceTarget resourceTarget, ResourceRequest resourceRequest, boolean checkOnly, boolean change) {
 
  60         List<ResourceData> resourceList = new ArrayList<>();
 
  62         if (allocationRuleMap != null) {
 
  63             List<AllocationRule> allocationRuleList = allocationRuleMap.get(serviceModel);
 
  64             if (allocationRuleList == null) {
 
  65                 allocationRuleList = allocationRuleMap.get("DEFAULT");
 
  68             if (allocationRuleList != null) {
 
  69                 boolean allgood = true;
 
  70                 for (AllocationRule allocationRule : allocationRuleList) {
 
  71                     AllocationRequest ar = allocationRule.buildAllocationRequest(serviceModel, resourceEntity,
 
  72                             resourceTarget, resourceRequest, checkOnly, change);
 
  74                         AllocationOutcome ao = resourceManager.allocateResources(ar);
 
  75                         List<ResourceData> rr = getResourceData(ao);
 
  76                         resourceList.addAll(rr);
 
  78                         if (ao.status != AllocationStatus.Success) {
 
  85                     String resourceSetId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId
 
  86                             + "::" + resourceEntity.resourceEntityVersion;
 
  87                     resourceManager.releaseResourceSet(resourceSetId);
 
  95     private List<ResourceData> getResourceData(AllocationOutcome ao) {
 
  96         if (ao instanceof MultiResourceAllocationOutcome) {
 
  97             List<ResourceData> rr = new ArrayList<>();
 
  98             for (AllocationOutcome ao1 : ((MultiResourceAllocationOutcome) ao).allocationOutcomeList) {
 
  99                 rr.addAll(getResourceData(ao1));
 
 104         ResourceData rd = new ResourceData();
 
 105         rd.data = new HashMap<>();
 
 107         AllocationRequest ar = ao.request;
 
 108         rd.resourceName = ar.resourceName;
 
 109         rd.endPointPosition = ar.endPointPosition;
 
 110         int i1 = ar.assetId.indexOf("::");
 
 112             rd.resourceTargetType = ar.assetId.substring(0, i1);
 
 113             rd.resourceTargetId = ar.assetId.substring(i1 + 2);
 
 115             rd.resourceTargetType = "";
 
 116             rd.resourceTargetId = ar.assetId;
 
 118         rd.status = ao.status.toString();
 
 120         if (ao instanceof LimitAllocationOutcome) {
 
 121             LimitAllocationOutcome lao = (LimitAllocationOutcome) ao;
 
 122             rd.data.put("allocated", String.valueOf(lao.allocatedCount));
 
 123             rd.data.put("used", String.valueOf(lao.used));
 
 124             rd.data.put("limit", String.valueOf(lao.limit));
 
 125             rd.data.put("available", String.valueOf(lao.limit - lao.used));
 
 126         } else if (ao instanceof RangeAllocationOutcome) {
 
 127             RangeAllocationOutcome rao = (RangeAllocationOutcome) ao;
 
 128             rd.data.put("allocated", String.valueOf(StrUtil.listInt(rao.allocated)));
 
 129             rd.data.put("used", String.valueOf(StrUtil.listInt(rao.used)));
 
 132         return Collections.singletonList(rd);
 
 136     public List<ResourceData> getResourcesForEntity(String resourceEntityType, String resourceEntityId,
 
 137             String resourceEntityVersion) {
 
 138         List<ResourceData> rdlist = new ArrayList<>();
 
 140         String resourceUnionId = resourceEntityType + "::" + resourceEntityId;
 
 141         List<Resource> rlist = resourceManager.getResourceUnion(resourceUnionId);
 
 143         for (Resource r : rlist) {
 
 145             // Find the needed allocation item: if resourceEntityVersion is specified, use that,
 
 146             // otherwise, find the latest allocation item
 
 147             AllocationItem ai = null;
 
 148             if (resourceEntityVersion != null) {
 
 149                 String resourceSetId = resourceUnionId + "::" + resourceEntityVersion;
 
 150                 for (AllocationItem ai1 : r.allocationItems) {
 
 151                     if (ai1.resourceSetId.equals(resourceSetId)) {
 
 158                 for (AllocationItem ai1 : r.allocationItems) {
 
 159                     if (ai1.resourceUnionId.equals(resourceUnionId)) {
 
 160                         if (aitime == null || ai1.allocationTime.after(aitime)) {
 
 162                             aitime = ai1.allocationTime;
 
 169                 ResourceData rd = new ResourceData();
 
 172                 rd.resourceName = r.resourceKey.resourceName;
 
 173                 int i1 = r.resourceKey.assetId.indexOf("::");
 
 175                     rd.resourceTargetType = r.resourceKey.assetId.substring(0, i1);
 
 176                     rd.resourceTargetId = r.resourceKey.assetId.substring(i1 + 2);
 
 178                     int i2 = r.resourceKey.assetId.lastIndexOf("::");
 
 180                         rd.resourceTargetValue = r.resourceKey.assetId.substring(i2 + 2);
 
 183                     rd.resourceTargetType = "";
 
 184                     rd.resourceTargetId = r.resourceKey.assetId;
 
 187                 rd.data = new HashMap<>();
 
 189                 if (ai instanceof RangeAllocationItem) {
 
 190                     RangeAllocationItem rai = (RangeAllocationItem) ai;
 
 192                     String ss = String.valueOf(rai.used);
 
 193                     ss = ss.substring(1, ss.length() - 1);
 
 194                     rd.data.put("allocated", ss);
 
 196                 } else if (ai instanceof LimitAllocationItem) {
 
 197                     LimitAllocationItem lai = (LimitAllocationItem) ai;
 
 199                     rd.data.put("allocated", String.valueOf(lai.used));
 
 208     public ResourceData getResource(String resourceTargetType, String resourceTargetId, String resourceName) {
 
 209         ResourceData rd = new ResourceData();;
 
 210         String assetId = resourceTargetType + "::" + resourceTargetId;
 
 211         Resource r = resourceManager.getResource(resourceName, assetId);
 
 213             log.info("ResourceName:" + r.resourceKey.resourceName + " assetId:" + r.resourceKey.assetId);
 
 215             rd.resourceName = r.resourceKey.resourceName;
 
 216             int i1 = r.resourceKey.assetId.indexOf("::");
 
 218                 rd.resourceTargetType = r.resourceKey.assetId.substring(0, i1);
 
 219                 rd.resourceTargetId = r.resourceKey.assetId.substring(i1 + 2);
 
 221                 int i2 = r.resourceKey.assetId.lastIndexOf("::");
 
 223                     rd.resourceTargetValue = r.resourceKey.assetId.substring(i2 + 2);
 
 226                 rd.resourceTargetType = "";
 
 227                 rd.resourceTargetId = r.resourceKey.assetId;
 
 230             rd.data = new HashMap<>();
 
 232             if (r instanceof RangeResource) {
 
 233                 RangeResource rr = (RangeResource) r;
 
 235                 log.info("rr.used: " + rr.used);
 
 236                 String ss = String.valueOf(rr.used);
 
 237                 ss = ss.substring(1, ss.length() - 1);
 
 238                 rd.data.put("allocated", ss);
 
 240             } else if (r instanceof LimitResource) {
 
 241                 LimitResource lr = (LimitResource) r;
 
 243                 log.info("lr.used: " + lr.used);
 
 244                 rd.data.put("allocated", String.valueOf(lr.used));
 
 251     public void setResourceManager(ResourceManager resourceManager) {
 
 252         this.resourceManager = resourceManager;
 
 255     public void setAllocationRuleMap(Map<String, List<AllocationRule>> allocationRuleMap) {
 
 256         this.allocationRuleMap = allocationRuleMap;