From 0a6fde9973487398b9cdb3fdfa3f79fac2bd9048 Mon Sep 17 00:00:00 2001 From: Stan Bonev Date: Mon, 21 Jan 2019 09:51:30 -0500 Subject: RA: Allow for partial resource release Change-Id: Ie0cffbfaae6bb0ffcdb682f91ef3481fbdb35d7a Issue-ID: CCSDK-971 Signed-off-by: Stan Bonev --- .../ccsdk/sli/adaptors/ra/ResourceAllocator.java | 72 +++++++------ .../adaptors/ra/comp/EndPointAllocatorImpl.java | 3 +- .../sli/adaptors/ra/comp/ResourceRequest.java | 2 + .../sli/adaptors/rm/comp/ReleaseFunction.java | 98 +++++++++++++---- .../sli/adaptors/rm/comp/ResourceManager.java | 9 +- .../sli/adaptors/rm/comp/ResourceManagerImpl.java | 62 ++++------- .../ccsdk/sli/adaptors/rm/data/ReleaseRequest.java | 46 ++++++++ .../org/onap/ccsdk/sli/adaptors/ra/DataSetup.java | 6 ++ .../onap/ccsdk/sli/adaptors/ra/TestRelease.java | 120 +++++++++++++++++++++ 9 files changed, 314 insertions(+), 104 deletions(-) create mode 100644 resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/data/ReleaseRequest.java (limited to 'resource-assignment/provider/src') diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/ResourceAllocator.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/ResourceAllocator.java index c0220d6b..944429a3 100644 --- a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/ResourceAllocator.java +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/ResourceAllocator.java @@ -36,6 +36,7 @@ import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceResponse; import org.onap.ccsdk.sli.adaptors.ra.comp.ResourceTarget; import org.onap.ccsdk.sli.adaptors.rm.comp.ResourceManager; import org.onap.ccsdk.sli.adaptors.rm.data.AllocationStatus; +import org.onap.ccsdk.sli.adaptors.rm.data.ReleaseRequest; import org.onap.ccsdk.sli.adaptors.util.speed.SpeedUtil; import org.onap.ccsdk.sli.adaptors.util.str.StrUtil; import org.onap.ccsdk.sli.core.sli.SvcLogicContext; @@ -49,11 +50,6 @@ public class ResourceAllocator implements SvcLogicResource { private static final Logger log = LoggerFactory.getLogger(ResourceAllocator.class); private static final String[] INPUT_PREFIX = {"ra-input.", "tmp.resource-allocator."}; - private static final String START_RELEASE = "Starting release for: {}"; - private static final String START_RELEASE_FOR_TARGET = "Starting release for: {} on target: {}"; - private static final String RESOURCE_ENTITY_ID= "resource-entity-id"; - private static final String SERVICE_INSTANCE_ID="service-instance-id"; - private static final String RESERVATION_ENTITY_ID= "reservation-entity-id"; private ResourceManager resourceManager; private EndPointAllocator endPointAllocator; @@ -104,7 +100,7 @@ public class ResourceAllocator implements SvcLogicResource { String orderBy, SvcLogicContext ctx) throws SvcLogicException { String resourceEntityId = getParam(ctx, - new String[] {SERVICE_INSTANCE_ID, RESERVATION_ENTITY_ID, RESOURCE_ENTITY_ID}, false, null); + new String[] {"service-instance-id", "resource-entity-id", "reservation-entity-id"}, false, null); String resourceEntityType = getParam(ctx, new String[] {"reservation-entity-type", "resource-entity-type"}, false, null); String resourceEntityVersion = @@ -150,7 +146,7 @@ public class ResourceAllocator implements SvcLogicResource { ResourceData rd = endPointAllocator.getResource(rt.resourceTargetType, rt.resourceTargetId, rr.resourceName, rr.resourceEntityTypeFilter, rr.resourceEntityIdFilter, rr.resourceShareGroupFilter); setResourceDataInResponse(Collections.singletonList(rd), rsList); - } else if ((rr!=null && (rr.resourceTargetTypeFilter != null || rr.resourceTargetIdFilter != null)) + } else if (rr != null && (rr.resourceTargetTypeFilter != null || rr.resourceTargetIdFilter != null) && rr.resourceName != null) { List rdlist = endPointAllocator.getResourcesForTarget(rr.resourceTargetTypeFilter, rr.resourceTargetIdFilter, rr.resourceName); @@ -201,7 +197,7 @@ public class ResourceAllocator implements SvcLogicResource { @Override public QueryStatus release(String resource, String key, SvcLogicContext ctx) throws SvcLogicException { String resourceEntityId = getParam(ctx, - new String[] {SERVICE_INSTANCE_ID, RESERVATION_ENTITY_ID, RESOURCE_ENTITY_ID}, true, null); + new String[] {"service-instance-id", "resource-entity-id", "reservation-entity-id"}, true, null); String resourceEntityType = getParam(ctx, new String[] {"reservation-entity-type", "resource-entity-type"}, true, null); String resourceEntityVersion = @@ -210,6 +206,11 @@ public class ResourceAllocator implements SvcLogicResource { getParam(ctx, new String[] {"reservation-target-id", "resource-target-id"}, false, null); String resourceTargetType = getParam(ctx, new String[] {"reservation-target-type", "resource-target-type"}, false, null); + String resourceName = getParam(ctx, new String[] {"resource-name"}, false, null); + String limitReleaseAmountStr = getParam(ctx, new String[] {"limit-release-amount"}, false, "-1"); + int limitReleaseAmount = Integer.parseInt(limitReleaseAmountStr); + String rangeReleaseNumbers = getParam(ctx, new String[] {"range-release-numbers"}, false, null); + String endPointPosition = getParam(ctx, "endpoint-position", false, null); @@ -220,6 +221,9 @@ public class ResourceAllocator implements SvcLogicResource { ResourceRequest rr = new ResourceRequest(); rr.endPointPosition = endPointPosition; + rr.resourceName = resourceName; + rr.rangeReleaseNumbers = rangeReleaseNumbers; + rr.limitReleaseAmount = limitReleaseAmount; ResourceTarget rt = new ResourceTarget(); rt.resourceTargetType = resourceTargetType; @@ -243,44 +247,46 @@ public class ResourceAllocator implements SvcLogicResource { public AllocationStatus release(ResourceEntity sd, ResourceRequest rr, ResourceTarget rt) throws Exception { + ReleaseRequest releaseRequest = new ReleaseRequest(); + if (sd != null && sd.resourceEntityVersion != null) { - String resourceSet = null; + releaseRequest.resourceSetId = null; if (rr != null && rr.endPointPosition != null && !rr.endPointPosition.isEmpty()) { - resourceSet = sd.resourceEntityType + "::" + sd.resourceEntityId + "::" + rr.endPointPosition + "::" - + sd.resourceEntityVersion; - } else { - resourceSet = sd.resourceEntityType + "::" + sd.resourceEntityId + "::" + sd.resourceEntityVersion; - } - - if (rt != null && rt.resourceTargetId != null && rt.resourceTargetType != null) { - String assetId = rt.resourceTargetType + "::" + rt.resourceTargetId; - log.info(START_RELEASE_FOR_TARGET, resourceSet, assetId); - resourceManager.releaseResourceSet(resourceSet, assetId); + releaseRequest.resourceSetId = sd.resourceEntityType + "::" + sd.resourceEntityId + "::" + + rr.endPointPosition + "::" + sd.resourceEntityVersion; } else { - log.info(START_RELEASE, resourceSet); - resourceManager.releaseResourceSet(resourceSet); + releaseRequest.resourceSetId = + sd.resourceEntityType + "::" + sd.resourceEntityId + "::" + sd.resourceEntityVersion; } } else if (sd != null && (sd.resourceEntityVersion == null || sd.resourceEntityVersion.isEmpty())) { - String resourceUnion = null; + releaseRequest.resourceUnionId = null; if (rr != null && rr.endPointPosition != null && !rr.endPointPosition.isEmpty()) { - resourceUnion = sd.resourceEntityType + "::" + sd.resourceEntityId + "::" + rr.endPointPosition; + releaseRequest.resourceUnionId = + sd.resourceEntityType + "::" + sd.resourceEntityId + "::" + rr.endPointPosition; } else { - resourceUnion = sd.resourceEntityType + "::" + sd.resourceEntityId; + releaseRequest.resourceUnionId = sd.resourceEntityType + "::" + sd.resourceEntityId; } + } - if (rt != null && rt.resourceTargetId != null && rt.resourceTargetType != null) { - String assetId = rt.resourceTargetType + "::" + rt.resourceTargetId; - log.info(START_RELEASE_FOR_TARGET, resourceUnion, assetId); - resourceManager.releaseResourceUnion(resourceUnion, assetId); - } else { - log.info(START_RELEASE, resourceUnion); - resourceManager.releaseResourceUnion(resourceUnion); - } + if (rt != null && rt.resourceTargetId != null && rt.resourceTargetType != null) { + releaseRequest.assetId = rt.resourceTargetType + "::" + rt.resourceTargetId; + } + + if (rr != null) { + releaseRequest.resourceName = rr.resourceName; + releaseRequest.releaseNumbers = + StrUtil.listInt(rr.rangeReleaseNumbers, "Invalid value for range-release-numbers"); + releaseRequest.releaseAmount = rr.limitReleaseAmount; } + log.info("Releasing resources:"); + StrUtil.info(log, releaseRequest); + + resourceManager.releaseResources(releaseRequest); + return AllocationStatus.Success; } @@ -389,7 +395,7 @@ public class ResourceAllocator implements SvcLogicResource { private ResourceEntity getResourceEntityData(SvcLogicContext ctx) throws SvcLogicException { ResourceEntity sd = new ResourceEntity(); sd.resourceEntityId = getParam(ctx, - new String[] {SERVICE_INSTANCE_ID, RESERVATION_ENTITY_ID, RESOURCE_ENTITY_ID}, true, null); + new String[] {"service-instance-id", "resource-entity-id", "reservation-entity-id"}, true, null); sd.resourceEntityType = getParam(ctx, new String[] {"reservation-entity-type", "resource-entity-type"}, true, null); sd.resourceEntityVersion = diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/EndPointAllocatorImpl.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/EndPointAllocatorImpl.java index f4109a1d..d188429e 100644 --- a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/EndPointAllocatorImpl.java +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/EndPointAllocatorImpl.java @@ -39,6 +39,7 @@ import org.onap.ccsdk.sli.adaptors.rm.data.MultiResourceAllocationOutcome; import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationItem; import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationOutcome; import org.onap.ccsdk.sli.adaptors.rm.data.RangeResource; +import org.onap.ccsdk.sli.adaptors.rm.data.ReleaseRequest; import org.onap.ccsdk.sli.adaptors.rm.data.Resource; import org.onap.ccsdk.sli.adaptors.util.str.StrUtil; import org.slf4j.Logger; @@ -83,7 +84,7 @@ public class EndPointAllocatorImpl implements EndPointAllocator { if (!allgood) { String resourceSetId = resourceEntity.resourceEntityType + "::" + resourceEntity.resourceEntityId + "::" + resourceEntity.resourceEntityVersion; - resourceManager.releaseResourceSet(resourceSetId); + resourceManager.releaseResources(ReleaseRequest.resourceSet(resourceSetId)); } } } diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/ResourceRequest.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/ResourceRequest.java index c870bc41..bc05af65 100644 --- a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/ResourceRequest.java +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/ra/comp/ResourceRequest.java @@ -48,4 +48,6 @@ public class ResourceRequest { public String resourceShareGroupFilter; public String resourceTargetTypeFilter; public String resourceTargetIdFilter; + public String rangeReleaseNumbers; + public int limitReleaseAmount; } diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ReleaseFunction.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ReleaseFunction.java index b26c54cf..b466b164 100644 --- a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ReleaseFunction.java +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ReleaseFunction.java @@ -9,9 +9,9 @@ * 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. @@ -22,6 +22,7 @@ package org.onap.ccsdk.sli.adaptors.rm.comp; +import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -30,7 +31,11 @@ import org.onap.ccsdk.sli.adaptors.lock.comp.ResourceLockedException; import org.onap.ccsdk.sli.adaptors.lock.comp.SynchronizedFunction; import org.onap.ccsdk.sli.adaptors.rm.dao.ResourceDao; import org.onap.ccsdk.sli.adaptors.rm.data.AllocationItem; +import org.onap.ccsdk.sli.adaptors.rm.data.LimitAllocationItem; +import org.onap.ccsdk.sli.adaptors.rm.data.RangeAllocationItem; +import org.onap.ccsdk.sli.adaptors.rm.data.ReleaseRequest; import org.onap.ccsdk.sli.adaptors.rm.data.Resource; +import org.onap.ccsdk.sli.adaptors.rm.data.ResourceType; import org.onap.ccsdk.sli.adaptors.rm.util.ResourceUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,42 +47,93 @@ class ReleaseFunction extends SynchronizedFunction { private ResourceDao resourceDao; - private String resourceSetId; - private String resourceUnionId; - private String assetId; + private ReleaseRequest releaseRequest; - public ReleaseFunction(LockHelper lockHelper, ResourceDao resourceDao, String resourceSetId, String resourceUnionId, - String assetId, Collection lockNames, int lockTimeout) { + public ReleaseFunction(LockHelper lockHelper, ResourceDao resourceDao, ReleaseRequest releaseRequest, + Collection lockNames, int lockTimeout) { super(lockHelper, lockNames, lockTimeout); this.resourceDao = resourceDao; - this.resourceSetId = resourceSetId; - this.resourceUnionId = resourceUnionId; - this.assetId = assetId; + this.releaseRequest = releaseRequest; } @Override public void _exec() throws ResourceLockedException { - List resourceList = assetId != null - ? (resourceSetId != null ? resourceDao.getResourceSetForAsset(resourceSetId, assetId) - : resourceDao.getResourceUnionForAsset(resourceUnionId, assetId)) - : (resourceSetId != null ? resourceDao.getResourceSet(resourceSetId) - : resourceDao.getResourceUnion(resourceUnionId)); + List resourceList = new ArrayList<>(); + if (releaseRequest.assetId != null && releaseRequest.resourceName != null) { + Resource r = resourceDao.getResource(releaseRequest.assetId, releaseRequest.resourceName); + if (r != null) { + resourceList.add(r); + } + } else if (releaseRequest.assetId != null) { + if (releaseRequest.resourceSetId != null) { + resourceList = resourceDao.getResourceSetForAsset(releaseRequest.resourceSetId, releaseRequest.assetId); + } else { + resourceList = + resourceDao.getResourceUnionForAsset(releaseRequest.resourceUnionId, releaseRequest.assetId); + } + } else { + if (releaseRequest.resourceSetId != null) { + resourceList = resourceDao.getResourceSet(releaseRequest.resourceSetId); + } else { + resourceList = resourceDao.getResourceUnion(releaseRequest.resourceUnionId); + } + } + for (Resource r : resourceList) { boolean updated = false; if (r.allocationItems != null) { Iterator i = r.allocationItems.iterator(); while (i.hasNext()) { AllocationItem ai = i.next(); - if (resourceSetId != null) { - if (resourceSetId.equals(ai.resourceSetId)) { - i.remove(); + if (releaseRequest.resourceSetId != null) { + + if (releaseRequest.resourceSetId.equals(ai.resourceSetId)) { + if (r.resourceType == ResourceType.Limit) { + LimitAllocationItem lai = (LimitAllocationItem) ai; + if (releaseRequest.releaseAmount > 0 && releaseRequest.releaseAmount < lai.used) { + lai.used -= releaseRequest.releaseAmount; + } else { + i.remove(); + } + } else if (r.resourceType == ResourceType.Range) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + if (releaseRequest.releaseNumbers != null && !releaseRequest.releaseNumbers.isEmpty()) { + rai.used.removeAll(releaseRequest.releaseNumbers); + if (rai.used.isEmpty()) { + i.remove(); + } + } else { + i.remove(); + } + } else { + i.remove(); + } updated = true; } - } else if (resourceUnionId != null) { + } else if (releaseRequest.resourceUnionId != null) { - if (resourceUnionId.equals(ai.resourceUnionId)) { - i.remove(); + if (releaseRequest.resourceUnionId.equals(ai.resourceUnionId)) { + if (r.resourceType == ResourceType.Limit) { + LimitAllocationItem lai = (LimitAllocationItem) ai; + if (releaseRequest.releaseAmount > 0 && releaseRequest.releaseAmount < lai.used) { + lai.used -= releaseRequest.releaseAmount; + } else { + i.remove(); + } + } else if (r.resourceType == ResourceType.Range) { + RangeAllocationItem rai = (RangeAllocationItem) ai; + if (releaseRequest.releaseNumbers != null && !releaseRequest.releaseNumbers.isEmpty()) { + rai.used.removeAll(releaseRequest.releaseNumbers); + if (rai.used.isEmpty()) { + i.remove(); + } + } else { + i.remove(); + } + } else { + i.remove(); + } updated = true; } diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManager.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManager.java index 68d25158..9dd54cc3 100644 --- a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManager.java +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManager.java @@ -24,6 +24,7 @@ package org.onap.ccsdk.sli.adaptors.rm.comp; import java.util.List; import org.onap.ccsdk.sli.adaptors.rm.data.AllocationOutcome; import org.onap.ccsdk.sli.adaptors.rm.data.AllocationRequest; +import org.onap.ccsdk.sli.adaptors.rm.data.ReleaseRequest; import org.onap.ccsdk.sli.adaptors.rm.data.Resource; public interface ResourceManager { @@ -34,13 +35,7 @@ public interface ResourceManager { AllocationOutcome allocateResources(AllocationRequest allocationRequest); - void releaseResourceSet(String resourceSetId); - - void releaseResourceUnion(String resourceUnionId); - - void releaseResourceSet(String resourceSetId, String assetId); - - void releaseResourceUnion(String resourceUnionId, String assetId); + void releaseResources(ReleaseRequest releaseRequest); Resource queryResource(String resourceName, String assetId, String resourceUnionFilter, String resourceShareGroupFilter); diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManagerImpl.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManagerImpl.java index c4d53ce7..83da2707 100644 --- a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManagerImpl.java +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/comp/ResourceManagerImpl.java @@ -28,6 +28,7 @@ import org.onap.ccsdk.sli.adaptors.lock.comp.LockHelper; import org.onap.ccsdk.sli.adaptors.rm.dao.ResourceDao; import org.onap.ccsdk.sli.adaptors.rm.data.AllocationOutcome; import org.onap.ccsdk.sli.adaptors.rm.data.AllocationRequest; +import org.onap.ccsdk.sli.adaptors.rm.data.ReleaseRequest; import org.onap.ccsdk.sli.adaptors.rm.data.Resource; import org.onap.ccsdk.sli.adaptors.rm.util.ResourceUtil; import org.onap.ccsdk.sli.adaptors.util.str.StrUtil; @@ -80,54 +81,31 @@ public class ResourceManagerImpl implements ResourceManager { } @Override - public void releaseResourceSet(String resourceSetId) { - List resourceList = resourceDao.getResourceSet(resourceSetId); - if (resourceList == null || resourceList.isEmpty()) { + public void releaseResources(ReleaseRequest releaseRequest) { + if (releaseRequest.resourceSetId == null && releaseRequest.resourceUnionId == null) { return; } - Set lockNames = getLockNames(resourceList); - ReleaseFunction releaseFunction = - new ReleaseFunction(lockHelper, resourceDao, resourceSetId, null, null, lockNames, lockTimeout); - releaseFunction.exec(); - } - - @Override - public void releaseResourceUnion(String resourceUnionId) { - List resourceList = resourceDao.getResourceUnion(resourceUnionId); - if (resourceList == null || resourceList.isEmpty()) { - return; - } - - Set lockNames = getLockNames(resourceList); - ReleaseFunction releaseFunction = - new ReleaseFunction(lockHelper, resourceDao, null, resourceUnionId, null, lockNames, lockTimeout); - releaseFunction.exec(); - } - - @Override - public void releaseResourceSet(String resourceSetId, String assetId) { - List resourceList = resourceDao.getResourceSetForAsset(resourceSetId, assetId); - if (resourceList == null || resourceList.isEmpty()) { - return; - } - - Set lockNames = getLockNames(resourceList); - ReleaseFunction releaseFunction = - new ReleaseFunction(lockHelper, resourceDao, resourceSetId, null, assetId, lockNames, lockTimeout); - releaseFunction.exec(); - } - - @Override - public void releaseResourceUnion(String resourceUnionId, String assetId) { - List resourceList = resourceDao.getResourceUnionForAsset(resourceUnionId, assetId); - if (resourceList == null || resourceList.isEmpty()) { - return; + Set lockNames = new HashSet<>(); + if (releaseRequest.assetId != null) { + lockNames.add(releaseRequest.assetId); + } else { + List resourceList = null; + if (releaseRequest.resourceSetId != null) { + resourceList = resourceDao.getResourceSet(releaseRequest.resourceSetId); + } else { + resourceList = resourceDao.getResourceUnion(releaseRequest.resourceUnionId); + } + + if (resourceList == null || resourceList.isEmpty()) { + return; + } + + lockNames = getLockNames(resourceList); } - Set lockNames = getLockNames(resourceList); ReleaseFunction releaseFunction = - new ReleaseFunction(lockHelper, resourceDao, null, resourceUnionId, assetId, lockNames, lockTimeout); + new ReleaseFunction(lockHelper, resourceDao, releaseRequest, lockNames, lockTimeout); releaseFunction.exec(); } diff --git a/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/data/ReleaseRequest.java b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/data/ReleaseRequest.java new file mode 100644 index 00000000..dba6a172 --- /dev/null +++ b/resource-assignment/provider/src/main/java/org/onap/ccsdk/sli/adaptors/rm/data/ReleaseRequest.java @@ -0,0 +1,46 @@ +/*- + * ============LICENSE_START======================================================= + * openECOMP : SDN-C + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + */ + +package org.onap.ccsdk.sli.adaptors.rm.data; + +import java.util.Set; + +public class ReleaseRequest { + + public String resourceUnionId = null; + public String resourceSetId = null; + public String assetId = null; + public String resourceName = null; + public int releaseAmount = 0; + public Set releaseNumbers = null; + + public static ReleaseRequest resourceSet(String resourceSetId) { + ReleaseRequest rr = new ReleaseRequest(); + rr.resourceSetId = resourceSetId; + return rr; + } + + public static ReleaseRequest resourceUnion(String resourceUnionId) { + ReleaseRequest rr = new ReleaseRequest(); + rr.resourceUnionId = resourceUnionId; + return rr; + } +} diff --git a/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/DataSetup.java b/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/DataSetup.java index 5dcf5991..9aa3f26c 100644 --- a/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/DataSetup.java +++ b/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/DataSetup.java @@ -96,6 +96,12 @@ public class DataSetup { return allocationItem.exists(where); } + public boolean checkItemNotThere(String resourceName, String assetId, String resourceSetId) { + String where = "resource_id = (SELECT resource_id FROM RESOURCE WHERE resource_name = '" + resourceName + + "' AND asset_id = '" + assetId + "') AND resource_set_id = '" + resourceSetId + "'"; + return !allocationItem.exists(where); + } + public void setTestDb(TestDb testDb) { this.testDb = testDb; } diff --git a/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/TestRelease.java b/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/TestRelease.java index a936786a..88ec586e 100644 --- a/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/TestRelease.java +++ b/resource-assignment/provider/src/test/java/jtest/org/onap/ccsdk/sli/adaptors/ra/TestRelease.java @@ -49,6 +49,8 @@ public class TestRelease { dataSetup.setupRangeItem("test-range-1", "Port::TESTPORT-2", "EVC::TEST-5::1", "EVC::TEST-5", "5"); + dataSetup.setupRangeItem("test-range-1", "Port::TESTPORT-2", "EVC::TEST-6::1", "EVC::TEST-6", "6-20"); + dataSetup.setupLimitItem("test-limit-1", "Port::TESTPORT-1", "EVC::TEST-1::1", "EVC::TEST-1", 100); dataSetup.setupLimitItem("test-limit-1", "Port::TESTPORT-1", "EVC::TEST-2::1", "EVC::TEST-2", 200); @@ -67,6 +69,8 @@ public class TestRelease { dataSetup.setupLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-3::2", "EVC::TEST-3", 400); dataSetup.setupLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-5::1", "EVC::TEST-5", 500); + + dataSetup.setupLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-6::1", "EVC::TEST-6", 1000); } @Test @@ -297,4 +301,120 @@ public class TestRelease { Assert.assertTrue(dataSetup.checkLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-3::1", 300)); Assert.assertTrue(dataSetup.checkLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-3::2", 400)); } + + @Test + public void test007() throws Exception { + + String t = "007"; + log.info("============== release node " + t + " ================================"); + log.info("=== Test release - partial release of range"); + + setupResourceData(); + + Assert.assertTrue(dataSetup.checkRangeItem("test-range-1", "Port::TESTPORT-2", "EVC::TEST-6::1", "6-20")); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("ra-input.resource-entity-type", "EVC"); + ctx.setAttribute("ra-input.resource-entity-id", "TEST-6"); + ctx.setAttribute("ra-input.resource-entity-version", "1"); + + ctx.setAttribute("ra-input.resource-target-type", "Port"); + ctx.setAttribute("ra-input.resource-target-id", "TESTPORT-2"); + + ctx.setAttribute("ra-input.resource-name", "test-range-1"); + ctx.setAttribute("ra-input.range-release-numbers", "7,9,15-17"); + + QueryStatus st = resourceAllocator.release("NETWORK-CAPACITY", null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + + Assert.assertTrue(dataSetup.checkRangeItem("test-range-1", "Port::TESTPORT-2", "EVC::TEST-6::1", "6,8,10-14,18-20")); + } + + @Test + public void test008() throws Exception { + + String t = "008"; + log.info("============== release node " + t + " ================================"); + log.info("=== Test release - partial release of range, but release all numbers"); + + setupResourceData(); + + Assert.assertTrue(dataSetup.checkRangeItem("test-range-1", "Port::TESTPORT-2", "EVC::TEST-6::1", "6-20")); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("ra-input.resource-entity-type", "EVC"); + ctx.setAttribute("ra-input.resource-entity-id", "TEST-6"); + ctx.setAttribute("ra-input.resource-entity-version", "1"); + + ctx.setAttribute("ra-input.resource-target-type", "Port"); + ctx.setAttribute("ra-input.resource-target-id", "TESTPORT-2"); + + ctx.setAttribute("ra-input.resource-name", "test-range-1"); + ctx.setAttribute("ra-input.range-release-numbers", "6-25"); + + QueryStatus st = resourceAllocator.release("NETWORK-CAPACITY", null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + + Assert.assertTrue(dataSetup.checkItemNotThere("test-range-1", "Port::TESTPORT-2", "EVC::TEST-6::1")); + } + + @Test + public void test009() throws Exception { + + String t = "009"; + log.info("============== release node " + t + " ================================"); + log.info("=== Test release - partial release of limit"); + + setupResourceData(); + + Assert.assertTrue(dataSetup.checkLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-6::1", 1000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("ra-input.resource-entity-type", "EVC"); + ctx.setAttribute("ra-input.resource-entity-id", "TEST-6"); + ctx.setAttribute("ra-input.resource-entity-version", "1"); + + ctx.setAttribute("ra-input.resource-target-type", "Port"); + ctx.setAttribute("ra-input.resource-target-id", "TESTPORT-2"); + + ctx.setAttribute("ra-input.resource-name", "test-limit-1"); + ctx.setAttribute("ra-input.limit-release-amount", "200"); + + QueryStatus st = resourceAllocator.release("NETWORK-CAPACITY", null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + + Assert.assertTrue(dataSetup.checkLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-6::1", 800)); + } + + @Test + public void test010() throws Exception { + + String t = "010"; + log.info("============== release node " + t + " ================================"); + log.info("=== Test release - partial release of limit, but release big number"); + + setupResourceData(); + + Assert.assertTrue(dataSetup.checkLimitItem("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-6::1", 1000)); + + SvcLogicContext ctx = new SvcLogicContext(); + ctx.setAttribute("ra-input.resource-entity-type", "EVC"); + ctx.setAttribute("ra-input.resource-entity-id", "TEST-6"); + ctx.setAttribute("ra-input.resource-entity-version", "1"); + + ctx.setAttribute("ra-input.resource-target-type", "Port"); + ctx.setAttribute("ra-input.resource-target-id", "TESTPORT-2"); + + ctx.setAttribute("ra-input.resource-name", "test-limit-1"); + ctx.setAttribute("ra-input.limit-release-amount", "2000"); + + QueryStatus st = resourceAllocator.release("NETWORK-CAPACITY", null, ctx); + + Assert.assertTrue(st == QueryStatus.SUCCESS); + + Assert.assertTrue(dataSetup.checkItemNotThere("test-limit-1", "Port::TESTPORT-2", "EVC::TEST-6::1")); + } } -- cgit 1.2.3-korg