summaryrefslogtreecommitdiffstats
path: root/vpp-common
diff options
context:
space:
mode:
authorJan Srnicek <jsrnicek@cisco.com>2016-10-06 08:54:02 +0200
committerJan Srnicek <jsrnicek@cisco.com>2016-10-06 08:54:02 +0200
commit8c9c430823aa19912a55b0a6ccfcbbb6a1bc028d (patch)
tree1e5aa752236ada01009a353cf34eb6b7706e65fc /vpp-common
parent15f481bc86adfd879e0e0d001ef3dd0939aa3649 (diff)
HONEYCOMB-236 - Unified read/write exceptions
Change-Id: Idde761d0c0c2c4d96555ef94dbdaa87fad889493 Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
Diffstat (limited to 'vpp-common')
-rw-r--r--vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/JvppDumpExecutorTest.java8
-rw-r--r--vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumer.java111
-rw-r--r--vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java31
3 files changed, 126 insertions, 24 deletions
diff --git a/vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/JvppDumpExecutorTest.java b/vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/JvppDumpExecutorTest.java
index da1600f2f..500c31387 100644
--- a/vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/JvppDumpExecutorTest.java
+++ b/vpp-common/vpp-translate-test/src/main/java/io/fd/honeycomb/vpp/test/read/JvppDumpExecutorTest.java
@@ -24,6 +24,8 @@ import static org.mockito.Mockito.when;
import io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor;
import io.fd.honeycomb.vpp.test.util.FutureProducer;
+import io.fd.vpp.jvpp.VppInvocationException;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
@@ -31,8 +33,6 @@ import java.util.concurrent.TimeoutException;
import org.junit.Before;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import io.fd.vpp.jvpp.VppInvocationException;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
/**
* Generic test for implementation of {@link EntityDumpExecutor}
@@ -78,9 +78,7 @@ public abstract class JvppDumpExecutorTest<T extends EntityDumpExecutor<?, ?>> i
* while performing desired method
*/
protected FutureJVppCore doThrowFailExceptionWhen() {
- return doReturn(failedFuture(
- new VppInvocationException("Exception invoked by " + JvppDumpExecutorTest.class.getName(), -1)))
- .when(api);
+ return doReturn(failedFuture()).when(api);
}
/**
diff --git a/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumer.java b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumer.java
index 9fb04c618..9e85c5d8b 100644
--- a/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumer.java
+++ b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/JvppReplyConsumer.java
@@ -18,15 +18,18 @@ package io.fd.honeycomb.translate.vpp.util;
import static com.google.common.base.Preconditions.checkArgument;
+import io.fd.honeycomb.translate.read.ReadFailedException;
+import io.fd.honeycomb.translate.write.WriteFailedException;
+import io.fd.vpp.jvpp.VppBaseCallException;
+import io.fd.vpp.jvpp.dto.JVppReply;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.annotation.Nonnegative;
import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.VppBaseCallException;
-import io.fd.vpp.jvpp.dto.JVppReply;
/**
* Trait providing logic for consuming reply's to jvpp api calls
@@ -35,18 +38,112 @@ public interface JvppReplyConsumer {
int DEFAULT_TIMEOUT_IN_SECONDS = 5;
+ /**
+ * Consumes reply for jvpp call representing any write operation
+ * Should be used in case of calls where it's not clear which write crud operation respective
+ * call represents, for ex. setRouting
+ */
default <REP extends JVppReply<?>> REP getReplyForWrite(@Nonnull Future<REP> future,
@Nonnull final InstanceIdentifier<?> replyType)
- throws VppBaseCallException, WriteTimeoutException {
+ throws WriteFailedException {
return getReplyForWrite(future, replyType, DEFAULT_TIMEOUT_IN_SECONDS);
}
+ /**
+ * Consumes reply for jvpp call representing any write operation
+ * Should be used in case of calls where it's not clear which write crud operation respective
+ * call represents, for ex. setRouting
+ */
default <REP extends JVppReply<?>> REP getReplyForWrite(@Nonnull Future<REP> future,
@Nonnull final InstanceIdentifier<?> replyType,
@Nonnegative final int timeoutInSeconds)
- throws VppBaseCallException, WriteTimeoutException {
+ throws WriteFailedException {
+ try {
+ return getReply(future, timeoutInSeconds);
+ } catch (TimeoutException e) {
+ throw new WriteTimeoutException(replyType, e);
+ } catch (VppBaseCallException e) {
+ throw new WriteFailedException(replyType, e);
+ }
+
+ }
+
+ /**
+ * Consumes reply for jvpp call representing create operation
+ */
+ default <REP extends JVppReply<?>> REP getReplyForCreate(@Nonnull Future<REP> future,
+ @Nonnull final InstanceIdentifier<?> replyType,
+ @Nonnull final DataObject data)
+ throws WriteFailedException {
+ return getReplyForCreate(future, replyType, data, DEFAULT_TIMEOUT_IN_SECONDS);
+ }
+
+ /**
+ * Consumes reply for jvpp call representing create operation
+ */
+ default <REP extends JVppReply<?>> REP getReplyForCreate(@Nonnull Future<REP> future,
+ @Nonnull final InstanceIdentifier<?> replyType,
+ @Nonnull final DataObject data,
+ @Nonnegative final int timeoutInSeconds)
+ throws WriteFailedException {
+ try {
+ return getReply(future, timeoutInSeconds);
+ } catch (VppBaseCallException e) {
+ throw new WriteFailedException.CreateFailedException(replyType, data, e);
+ } catch (TimeoutException e) {
+ throw new WriteTimeoutException(replyType, e);
+ }
+ }
+
+ /**
+ * Consumes reply for jvpp call representing update operation
+ */
+ default <REP extends JVppReply<?>> REP getReplyForUpdate(@Nonnull Future<REP> future,
+ @Nonnull final InstanceIdentifier<?> replyType,
+ @Nonnull final DataObject dataBefore,
+ @Nonnull final DataObject dataAfter)
+ throws WriteFailedException {
+ return getReplyForUpdate(future, replyType, dataBefore, dataAfter, DEFAULT_TIMEOUT_IN_SECONDS);
+ }
+
+ /**
+ * Consumes reply for jvpp call representing update operation
+ */
+ default <REP extends JVppReply<?>> REP getReplyForUpdate(@Nonnull Future<REP> future,
+ @Nonnull final InstanceIdentifier<?> replyType,
+ @Nonnull final DataObject dataBefore,
+ @Nonnull final DataObject dataAfter,
+ @Nonnegative final int timeoutInSeconds)
+ throws WriteFailedException {
+ try {
+ return getReply(future, timeoutInSeconds);
+ } catch (VppBaseCallException e) {
+ throw new WriteFailedException.UpdateFailedException(replyType, dataBefore, dataAfter, e);
+ } catch (TimeoutException e) {
+ throw new WriteTimeoutException(replyType, e);
+ }
+ }
+
+ /**
+ * Consumes reply for jvpp call representing delete operation
+ */
+ default <REP extends JVppReply<?>> REP getReplyForDelete(@Nonnull Future<REP> future,
+ @Nonnull final InstanceIdentifier<?> replyType)
+ throws WriteFailedException {
+ return getReplyForDelete(future, replyType, DEFAULT_TIMEOUT_IN_SECONDS);
+ }
+
+ /**
+ * Consumes reply for jvpp call representing delete operation
+ */
+ default <REP extends JVppReply<?>> REP getReplyForDelete(@Nonnull Future<REP> future,
+ @Nonnull final InstanceIdentifier<?> replyType,
+ @Nonnegative final int timeoutInSeconds)
+ throws WriteFailedException {
try {
return getReply(future, timeoutInSeconds);
+ } catch (VppBaseCallException e) {
+ throw new WriteFailedException.DeleteFailedException(replyType, e);
} catch (TimeoutException e) {
throw new WriteTimeoutException(replyType, e);
}
@@ -54,18 +151,20 @@ public interface JvppReplyConsumer {
default <REP extends JVppReply<?>> REP getReplyForRead(@Nonnull Future<REP> future,
@Nonnull final InstanceIdentifier<?> replyType)
- throws VppBaseCallException, ReadTimeoutException {
+ throws ReadFailedException {
return getReplyForRead(future, replyType, DEFAULT_TIMEOUT_IN_SECONDS);
}
default <REP extends JVppReply<?>> REP getReplyForRead(@Nonnull Future<REP> future,
@Nonnull final InstanceIdentifier<?> replyType,
@Nonnegative final int timeoutInSeconds)
- throws VppBaseCallException, ReadTimeoutException {
+ throws ReadFailedException {
try {
return getReply(future, timeoutInSeconds);
} catch (TimeoutException e) {
throw new ReadTimeoutException(replyType, e);
+ } catch (VppBaseCallException e) {
+ throw new ReadFailedException(replyType, e);
}
}
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java
index 0d7702bc0..ac7dcece0 100644
--- a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java
+++ b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/cache/DumpCacheManagerTest.java
@@ -22,16 +22,17 @@ import static org.mockito.Mockito.when;
import com.google.common.base.Optional;
import io.fd.honeycomb.translate.ModificationCache;
+import io.fd.honeycomb.translate.read.ReadFailedException;
import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager;
import io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor;
import io.fd.honeycomb.translate.util.read.cache.EntityDumpPostProcessingFunction;
-import io.fd.honeycomb.translate.util.read.cache.exceptions.execution.DumpExecutionFailedException;
+import io.fd.vpp.jvpp.core.dto.IpDetails;
+import io.fd.vpp.jvpp.core.dto.IpDetailsReplyDump;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-import io.fd.vpp.jvpp.core.dto.IpDetails;
-import io.fd.vpp.jvpp.core.dto.IpDetailsReplyDump;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
public class DumpCacheManagerTest {
@@ -40,6 +41,9 @@ public class DumpCacheManagerTest {
@Mock
private EntityDumpExecutor<IpDetailsReplyDump, Void> executor;
+ @Mock
+ private InstanceIdentifier identifier;
+
private DumpCacheManager<IpDetailsReplyDump, Void> managerPositive;
private DumpCacheManager<IpDetailsReplyDump, Void> managerPositiveWithPostProcessing;
private DumpCacheManager<IpDetailsReplyDump, Void> managerNegative;
@@ -70,13 +74,13 @@ public class DumpCacheManagerTest {
* This test verify full dump-caching cycle
*/
@Test
- public void testCaching() throws DumpExecutionFailedException {
+ public void testCaching() throws ReadFailedException {
final IpDetailsReplyDump stage1Data = new IpDetailsReplyDump();
// executor cant return null data
- when(executor.executeDump(NO_PARAMS)).thenReturn(new IpDetailsReplyDump());
+ when(executor.executeDump(identifier, NO_PARAMS)).thenReturn(new IpDetailsReplyDump());
- final Optional<IpDetailsReplyDump> stage1Optional = managerNegative.getDump(KEY, cache, NO_PARAMS);
+ final Optional<IpDetailsReplyDump> stage1Optional = managerNegative.getDump(identifier, KEY, cache, NO_PARAMS);
// this is first call so instance should be from executor
// and it should be cached after calling executor
@@ -87,33 +91,34 @@ public class DumpCacheManagerTest {
//rebind executor with other data
IpDetailsReplyDump stage2LoadedDump = new IpDetailsReplyDump();
- when(executor.executeDump(NO_PARAMS)).thenReturn(stage2LoadedDump);
+ when(executor.executeDump(identifier, NO_PARAMS)).thenReturn(stage2LoadedDump);
- final Optional<IpDetailsReplyDump> stage2Optional = managerPositive.getDump(KEY, cache, NO_PARAMS);
+ final Optional<IpDetailsReplyDump> stage2Optional = managerPositive.getDump(identifier, KEY, cache, NO_PARAMS);
assertEquals(true, stage2Optional.isPresent());
assertEquals(stage2LoadedDump, stage2Optional.get());
//rebind executor with other data
IpDetailsReplyDump stage3LoadedDump = new IpDetailsReplyDump();
- when(executor.executeDump(NO_PARAMS)).thenReturn(stage3LoadedDump);
+ when(executor.executeDump(identifier, NO_PARAMS)).thenReturn(stage3LoadedDump);
- final Optional<IpDetailsReplyDump> stage3Optional = managerPositive.getDump(KEY, cache, NO_PARAMS);
+ final Optional<IpDetailsReplyDump> stage3Optional = managerPositive.getDump(identifier, KEY, cache, NO_PARAMS);
assertEquals(true, stage3Optional.isPresent());
//check if it returns instance cached from previous stage
assertEquals(stage2LoadedDump, stage3Optional.get());
}
@Test
- public void testPostprocessing() throws DumpExecutionFailedException {
+ public void testPostprocessing() throws ReadFailedException {
IpDetailsReplyDump dump = new IpDetailsReplyDump();
IpDetails details = new IpDetails();
details.swIfIndex = 2;
dump.ipDetails.add(details);
- when(executor.executeDump(null)).thenReturn(dump);
+ when(executor.executeDump(identifier, null)).thenReturn(dump);
- Optional<IpDetailsReplyDump> optionalDump = managerPositiveWithPostProcessing.getDump(KEY, cache, NO_PARAMS);
+ Optional<IpDetailsReplyDump> optionalDump =
+ managerPositiveWithPostProcessing.getDump(identifier, KEY, cache, NO_PARAMS);
assertEquals(true, optionalDump.isPresent());
assertEquals(1, optionalDump.get().ipDetails.size());