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.Arrays;
 
  26 import java.util.Collections;
 
  27 import java.util.HashMap;
 
  28 import java.util.List;
 
  31 import org.apache.commons.lang.NotImplementedException;
 
  32 import org.onap.ccsdk.sli.adaptors.ra.equip.data.EquipmentData;
 
  33 import org.onap.ccsdk.sli.adaptors.rm.comp.ResourceManager;
 
  34 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationItem;
 
  35 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationOutcome;
 
  36 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationRequest;
 
  37 import org.onap.ccsdk.sli.adaptors.rm.data.AllocationStatus;
 
  38 import org.onap.ccsdk.sli.adaptors.rm.data.LimitAllocationItem;
 
  39 import org.onap.ccsdk.sli.adaptors.rm.data.LimitResource;
 
  40 import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationItem;
 
  41 import org.onap.ccsdk.sli.adaptors.rm.data.RangeResource;
 
  42 import org.onap.ccsdk.sli.adaptors.rm.data.Resource;
 
  43 import org.slf4j.Logger;
 
  44 import org.slf4j.LoggerFactory;
 
  46 public class EndPointAllocatorImpl implements EndPointAllocator {
 
  48     private static final Logger log = LoggerFactory.getLogger(EndPointAllocatorImpl.class);
 
  50     private Map<String, List<EndPointAllocationDefinition>> endPointAllocationDefinitionMap;
 
  52     private ResourceManager resourceManager;
 
  55     public List<EndPointData> allocateEndPoints(
 
  56             ServiceData serviceData,
 
  57             Map<String, Object> equipmentConstraints,
 
  61         List<EndPointAllocationDefinition> defList = endPointAllocationDefinitionMap.get(serviceData.serviceModel);
 
  63             throw new NotImplementedException("Service model: " + serviceData.serviceModel + " not supported");
 
  65         List<EndPointData> epList = new ArrayList<>();
 
  66         for (EndPointAllocationDefinition def : defList) {
 
  67             if (serviceData.endPointPosition != null && !serviceData.endPointPosition.equals(def.endPointPosition))
 
  71                     "Starting allocation of end point: " + def.endPointPosition + ": " + serviceData.serviceInstanceId);
 
  73             String resourceUnionId = serviceData.serviceInstanceId + '/' + def.endPointPosition;
 
  74             String resourceSetId = resourceUnionId + '/' + changeNumber;
 
  76             String equipmentId = (String) equipmentConstraints.get("equipment-id");
 
  77             if (equipmentId == null) {
 
  78                 EndPointData epExisting = readEndPoint(resourceUnionId, resourceSetId);
 
  79                 if (epExisting != null && epExisting.equipmentId != null) {
 
  80                     equipmentConstraints.put("equipment-id", epExisting.equipmentId);
 
  82                     log.info("Trying assignment on the current equipment: " + epExisting.equipmentId);
 
  86             List<EquipmentData> equipList = def.equipmentReader.readEquipment(equipmentConstraints);
 
  87             if (equipList == null || equipList.isEmpty()) {
 
  88                 log.info("Equipment not found for " + def.endPointPosition);
 
  92             if (def.equipmentCheckList != null) {
 
  93                 for (EquipmentCheck filter : def.equipmentCheckList) {
 
  94                     List<EquipmentData> newEquipList = new ArrayList<>();
 
  95                     for (EquipmentData equipData : equipList)
 
  96                         if (filter.checkEquipment(def.endPointPosition, serviceData, equipData, equipmentConstraints))
 
  97                             newEquipList.add(equipData);
 
  98                     equipList = newEquipList;
 
 100                 if (equipList.isEmpty()) {
 
 101                     log.info("No equipment meets the requiremets for the service for: " + def.endPointPosition);
 
 106             if (equipList.size() > 1 && def.preferenceRuleList != null && !def.preferenceRuleList.isEmpty()) {
 
 108                 List<PrefEquipment> prefEquipList = new ArrayList<>();
 
 109                 for (EquipmentData equipData : equipList) {
 
 110                     PrefEquipment prefEquip = new PrefEquipment();
 
 111                     prefEquip.equipData = equipData;
 
 112                     prefEquip.prefNumbers = new long[def.preferenceRuleList.size()];
 
 113                     prefEquipList.add(prefEquip);
 
 116                     for (PreferenceRule prefRule : def.preferenceRuleList)
 
 117                         prefEquip.prefNumbers[i++] =
 
 118                                 prefRule.assignOrderNumber(def.endPointPosition, serviceData, equipData);
 
 121                 Collections.sort(prefEquipList);
 
 123                 equipList = new ArrayList<>();
 
 124                 for (PrefEquipment prefEquip : prefEquipList)
 
 125                     equipList.add(prefEquip.equipData);
 
 128             for (EquipmentData equipData : equipList) {
 
 129                 boolean allgood = true;
 
 130                 if (def.allocationRuleList != null)
 
 131                     for (AllocationRule allocationRule : def.allocationRuleList) {
 
 132                         AllocationRequest ar = allocationRule.buildAllocationRequest(resourceUnionId, resourceSetId,
 
 133                                 def.endPointPosition, serviceData, equipData, checkOnly, change);
 
 135                             AllocationOutcome ao = resourceManager.allocateResources(ar);
 
 136                             if (ao.status != AllocationStatus.Success) {
 
 143                     EndPointData ep = readEndPoint(resourceUnionId, resourceSetId);
 
 153     private EndPointData readEndPoint(String resourceUnionId, String resourceSetId) {
 
 154         EndPointData ep = new EndPointData();
 
 155         ep.resourceUnionId = resourceUnionId;
 
 156         ep.resourceSetId = resourceSetId;
 
 158         int i1 = resourceUnionId.indexOf('/');
 
 160             ep.endPointPosition = resourceUnionId.substring(i1 + 1);
 
 162         ep.data = new HashMap<>();
 
 164         List<Resource> rlist = resourceManager.getResourceUnion(resourceUnionId);
 
 165         for (Resource r : rlist) {
 
 166             if (r instanceof RangeResource) {
 
 167                 RangeResource rr = (RangeResource) r;
 
 168                 for (AllocationItem ai : r.allocationItems)
 
 169                     if (ai.resourceUnionId.equals(resourceUnionId)) {
 
 170                         RangeAllocationItem rai = (RangeAllocationItem) ai;
 
 171                         ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName, rai.used.first());
 
 174             if (r instanceof LimitResource) {
 
 175                 LimitResource rr = (LimitResource) r;
 
 176                 for (AllocationItem ai : r.allocationItems)
 
 177                     if (ai.resourceUnionId.equals(resourceUnionId)) {
 
 178                         LimitAllocationItem rai = (LimitAllocationItem) ai;
 
 179                         ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName + ".allocated", rai.used);
 
 180                         ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName + ".used", rr.used);
 
 181                         ep.data.put(ep.endPointPosition + '.' + rr.resourceKey.resourceName + ".assetId",
 
 182                                 r.resourceKey.assetId);
 
 190     private static class PrefEquipment implements Comparable<PrefEquipment> {
 
 192         public long[] prefNumbers;
 
 193         public EquipmentData equipData;
 
 196         public int compareTo(PrefEquipment o) {
 
 197             for (int i = 0; i < prefNumbers.length; i++) {
 
 198                 if (prefNumbers[i] < o.prefNumbers[i])
 
 200                 if (prefNumbers[i] > o.prefNumbers[i])
 
 207         public boolean equals(Object object) {
 
 208             if (this == object) {
 
 211             if (!(object instanceof PrefEquipment)) {
 
 214             if (!super.equals(object)) {
 
 218             PrefEquipment that = (PrefEquipment) object;
 
 219             if (equipData != null ? !equipData.equals(that.equipData) : that.equipData != null) {
 
 223             if (!Arrays.equals(prefNumbers, that.prefNumbers)) {
 
 231         public int hashCode() {
 
 232             int result = super.hashCode();
 
 233             result = 31 * result + (equipData != null ? equipData.hashCode() : 0);
 
 234             result = 31 * result + Arrays.hashCode(prefNumbers);
 
 239     public void setEndPointAllocationDefinitionMap(
 
 240             Map<String, List<EndPointAllocationDefinition>> endPointAllocationDefinitionMap) {
 
 241         this.endPointAllocationDefinitionMap = endPointAllocationDefinitionMap;
 
 244     public void setResourceManager(ResourceManager resourceManager) {
 
 245         this.resourceManager = resourceManager;