GENIUS-171 IdManager's releaseId() returns id being released 07/83107/3
authorAmitesh Soni <amitesh.soni@ericsson.com>
Thu, 18 Jul 2019 10:59:56 +0000 (16:29 +0530)
committerFaseela K <faseela.k@ericsson.com>
Tue, 27 Aug 2019 05:31:10 +0000 (05:31 +0000)
The releaseId() RPC now returns the release-id upon successful release
so that applications can use the same for cleaning-up their id which
they might have cached in their states.

Signed-off-by: Amitesh Soni <amitesh.soni@ericsson.com>
Change-Id: I811a2b1b4daf7124162b35c5d88159b6a917f8c2

idmanager/idmanager-api/src/main/yang/id-manager.yang
idmanager/idmanager-impl/src/main/java/org/opendaylight/genius/idmanager/IdManager.java
idmanager/idmanager-impl/src/test/java/org/opendaylight/genius/idmanager/test/IdManagerTest.java

index f2546e2748fd385b69159309a40d263cc45158a5..e3811ac61ad665bea2c32205f369d4ee15c113ef 100644 (file)
@@ -133,6 +133,12 @@ module id-manager {
                 type string;
              }
         }
+        output {
+             leaf-list id-values{
+                 type uint32;
+                     ordered-by user;
+             }
+        }
     }
 
     rpc allocateIdRange {
index a95b595779c7cfb10867d78e114b0cfd45ff0f88..dd99e7e8d7557470d9829fab24d1b6af143ec546 100644 (file)
@@ -72,6 +72,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdPools;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPoolBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPoolKey;
@@ -276,11 +277,9 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
         String poolName = input.getPoolName();
         String idKey = input.getIdKey();
         String uniqueKey = idUtils.getUniqueKey(poolName, idKey);
-        return FutureRpcResults.fromListenableFuture(LOG, "releaseId", input, () -> {
+        return FutureRpcResults.fromBuilder(LOG, "releaseId", input, () -> {
             idUtils.lock(lockManager, uniqueKey);
-            releaseIdFromLocalPool(poolName, idUtils.getLocalPoolName(poolName), idKey);
-            // TODO return the Future from releaseIdFromLocalPool() instead.. check all callers @CheckReturnValue
-            return Futures.immediateFuture((ReleaseIdOutput) null);
+            return releaseIdFromLocalPool(poolName, idUtils.getLocalPoolName(poolName), idKey);
         }).onFailureLogLevel(FutureRpcResults.LogLevel.NONE)
                 .onFailure(e -> {
                     if (e instanceof IdDoesNotExistException) {
@@ -541,7 +540,7 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
         return idCount;
     }
 
-    private void releaseIdFromLocalPool(String parentPoolName, String localPoolName, String idKey)
+    private ReleaseIdOutputBuilder releaseIdFromLocalPool(String parentPoolName, String localPoolName, String idKey)
             throws ReadFailedException, IdManagerException {
         String idLatchKey = idUtils.getUniqueKey(parentPoolName, idKey);
         LOG.debug("Releasing ID {} from pool {}", idKey, localPoolName);
@@ -570,7 +569,8 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
         if (!existingIdEntryObject.isPresent()) {
             LOG.info("Specified Id key {} does not exist in id pool {}", idKey, parentPoolName);
             idUtils.unlock(lockManager, idLatchKey);
-            return;
+            throw new IdManagerException(String.format("Specified Id key %s does not exist in id pool %s",
+                    idKey, parentPoolName));
         }
         IdEntries existingIdEntry = existingIdEntryObject.get();
         List<Long> idValuesList = nonnull(existingIdEntry.getIdValue());
@@ -587,6 +587,7 @@ public class IdManager implements IdManagerService, IdManagerMonitor {
         UpdateIdEntryJob job = new UpdateIdEntryJob(parentPoolName, localPoolName, idKey, null, txRunner, idUtils,
                         lockManager);
         jobCoordinator.enqueueJob(parentPoolName, job, IdUtils.RETRY_COUNT);
+        return new ReleaseIdOutputBuilder().setIdValues(idValuesList);
     }
 
     private void scheduleCleanUpTask(final IdLocalPool localIdPoolCache,
index ad321705483798e324a298dc386e4c829ac4d2ca..473eb23429911319b8d5533641a08d52ded92608 100644 (file)
@@ -61,6 +61,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdPools;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPool;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPoolBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.IdPoolKey;
@@ -145,8 +146,11 @@ public class IdManagerTest {
         ReleaseIdInput releaseIdInput = new ReleaseIdInputBuilder().setIdKey(TEST_KEY1).setPoolName(ID_POOL_NAME)
                 .build();
         idManagerService.createIdPool(createIdPoolInput);
-        idManagerService.allocateId(allocateIdInput);
-        assertTrue(idManagerService.releaseId(releaseIdInput).get().isSuccessful());
+        Future<RpcResult<AllocateIdOutput>> allocateIdResult = idManagerService.allocateId(allocateIdInput);
+        assertTrue(allocateIdResult.get().isSuccessful());
+        Future<RpcResult<ReleaseIdOutput>> result = idManagerService.releaseId(releaseIdInput);
+        assertTrue(result.get().isSuccessful());
+        assertEquals(allocateIdResult.get().getResult().getIdValue(), result.get().getResult().getIdValues().get(0));
         coordinatorEventsWaiter.awaitEventsConsumption();
 
         validateIdPools(ExpectedReleaseIdObjects.idPoolParent(), ExpectedReleaseIdObjects.idPoolChild());