summaryrefslogtreecommitdiffstats
path: root/lisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java')
-rwxr-xr-xlisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java134
1 files changed, 127 insertions, 7 deletions
diff --git a/lisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java b/lisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java
index 0764880ff..d7003c802 100755
--- a/lisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java
+++ b/lisp/lisp2vpp/src/main/java/io/fd/honeycomb/lisp/translate/read/AdjacencyCustomizer.java
@@ -17,29 +17,64 @@
package io.fd.honeycomb.lisp.translate.read;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import com.google.common.base.Optional;
+import io.fd.honeycomb.lisp.context.util.AdjacenciesMappingContext;
+import io.fd.honeycomb.lisp.context.util.EidMappingContext;
+import io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsDumpParams;
+import io.fd.honeycomb.lisp.translate.util.EidTranslator;
+import io.fd.honeycomb.translate.MappingContext;
import io.fd.honeycomb.translate.read.ReadContext;
import io.fd.honeycomb.translate.read.ReadFailedException;
import io.fd.honeycomb.translate.spi.read.ListReaderCustomizer;
+import io.fd.honeycomb.translate.util.RWUtils;
+import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager;
+import io.fd.honeycomb.translate.util.read.cache.EntityDumpExecutor;
import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
+import io.fd.honeycomb.translate.vpp.util.JvppReplyConsumer;
+import io.fd.vpp.jvpp.core.dto.LispAdjacenciesGet;
+import io.fd.vpp.jvpp.core.dto.LispAdjacenciesGetReply;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import io.fd.vpp.jvpp.core.types.LispAdjacency;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
import javax.annotation.Nonnull;
-import javax.naming.OperationNotSupportedException;
+import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.adjacencies.identification.context.rev160801.adjacencies.identification.context.attributes.adjacencies.identification.contexts.adjacencies.identification.mappings.mapping.EidIdentificatorPair;
+import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.adjacencies.identification.context.rev160801.adjacencies.identification.context.attributes.adjacencies.identification.contexts.adjacencies.identification.mappings.mapping.EidIdentificatorPairBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.MappingId;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.AdjacenciesBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.Adjacency;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.AdjacencyBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.adjacencies.grouping.adjacencies.AdjacencyKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTable;
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import io.fd.vpp.jvpp.core.future.FutureJVppCore;
-
public class AdjacencyCustomizer extends FutureJVppCustomizer
- implements ListReaderCustomizer<Adjacency, AdjacencyKey, AdjacencyBuilder> {
+ implements ListReaderCustomizer<Adjacency, AdjacencyKey, AdjacencyBuilder>, JvppReplyConsumer, EidTranslator {
- public AdjacencyCustomizer(@Nonnull final FutureJVppCore futureJvpp) {
+ private final DumpCacheManager<LispAdjacenciesGetReply, AdjacencyDumpParams> dumpCacheManager;
+ private final AdjacenciesMappingContext adjacenciesMappingContext;
+ private final EidPairProducer eidPairProducer;
+
+
+ public AdjacencyCustomizer(@Nonnull final FutureJVppCore futureJvpp,
+ @Nonnull final EidMappingContext localMappingContext,
+ @Nonnull final EidMappingContext remoteMappingContext,
+ @Nonnull final AdjacenciesMappingContext adjacenciesMappingContext) {
super(futureJvpp);
+ dumpCacheManager = new DumpCacheManager.DumpCacheManagerBuilder<LispAdjacenciesGetReply, AdjacencyDumpParams>()
+ .withExecutor(createExecutor())
+ .build();
+
+ this.adjacenciesMappingContext =
+ checkNotNull(adjacenciesMappingContext, "Adjacencies mapping context cannot be null");
+ this.eidPairProducer = new EidPairProducer(localMappingContext, remoteMappingContext);
}
@Nonnull
@@ -47,6 +82,22 @@ public class AdjacencyCustomizer extends FutureJVppCustomizer
public List<AdjacencyKey> getAllIds(@Nonnull final InstanceIdentifier<Adjacency> id,
@Nonnull final ReadContext context) throws ReadFailedException {
+ final int vni = id.firstKeyOf(VniTable.class).getVirtualNetworkIdentifier().intValue();
+
+ final Optional<LispAdjacenciesGetReply> optionalDump =
+ dumpCacheManager.getDump(id, context.getModificationCache(), new AdjacencyDumpParams(vni));
+
+
+ if (optionalDump.isPresent()) {
+ return Arrays.stream(optionalDump.get().adjacencies)
+ .map(lispAdjacency -> eidPairProducer.createPair(lispAdjacency, vni, context.getMappingContext()))
+ .map(pair -> adjacenciesMappingContext
+ .getAdjacencyId(pair.getLocalEidId().getValue(), pair.getRemoteEidId().getValue(),
+ context.getMappingContext()))
+ .map(AdjacencyKey::new)
+ .collect(Collectors.toList());
+ }
+
//does not throw exception to not disturb lisp state reading
return Collections.emptyList();
}
@@ -66,7 +117,76 @@ public class AdjacencyCustomizer extends FutureJVppCustomizer
public void readCurrentAttributes(@Nonnull final InstanceIdentifier<Adjacency> id,
@Nonnull final AdjacencyBuilder builder, @Nonnull final ReadContext ctx)
throws ReadFailedException {
- // TODO - finish after https://jira.fd.io/browse/VPP-362
- throw new ReadFailedException(id, new OperationNotSupportedException("Operation not supported"));
+
+ final int vni = id.firstKeyOf(VniTable.class).getVirtualNetworkIdentifier().intValue();
+
+ final Optional<LispAdjacenciesGetReply> optionalDump = dumpCacheManager
+ .getDump(id, ctx.getModificationCache(), new AdjacencyDumpParams(vni));
+
+ if (!optionalDump.isPresent() || optionalDump.get().adjacencies.length == 0) {
+ return;
+ }
+
+ final String currentAdjacencyId = id.firstKeyOf(Adjacency.class).getId();
+ final EidIdentificatorPair currentAdjacencyIdentificationPair =
+ adjacenciesMappingContext.getEidPair(currentAdjacencyId, ctx.getMappingContext());
+
+ final LispAdjacency currentAdjacency = Arrays.stream(optionalDump.get().adjacencies)
+ .filter(lispAdjacency -> Objects.equals(currentAdjacencyIdentificationPair,
+ eidPairProducer.createPair(lispAdjacency, vni, ctx.getMappingContext())))
+ .collect(RWUtils.singleItemCollector());
+
+ builder.setId(currentAdjacencyId)
+ .setKey(new AdjacencyKey(currentAdjacencyId))
+ .setLocalEid(getArrayAsLocalEid(
+ MappingsDumpParams.EidType.valueOf(currentAdjacency.eidType), currentAdjacency.leid, vni))
+ .setRemoteEid(getArrayAsRemoteEid(
+ MappingsDumpParams.EidType.valueOf(currentAdjacency.eidType), currentAdjacency.reid, vni));
+ }
+
+ private EntityDumpExecutor<LispAdjacenciesGetReply, AdjacencyDumpParams> createExecutor() {
+ return (final InstanceIdentifier<?> identifier, final AdjacencyDumpParams params) -> {
+ checkNotNull(params, "Dump parameters cannot be null");
+
+ final LispAdjacenciesGet request = new LispAdjacenciesGet();
+ request.vni = params.getVni();
+
+ return getReplyForRead(getFutureJVpp().lispAdjacenciesGet(request).toCompletableFuture(), identifier);
+ };
+ }
+
+ private class EidPairProducer implements EidTranslator {
+
+ private final EidMappingContext localMappingContext;
+ private final EidMappingContext remoteMappingContext;
+
+ public EidPairProducer(final EidMappingContext localMappingContext,
+ final EidMappingContext remoteMappingContext) {
+ this.localMappingContext = checkNotNull(localMappingContext, "Local mapping context cannot be null");
+ this.remoteMappingContext = checkNotNull(remoteMappingContext, "Remote mapping context cannot be null");
+ }
+
+ public EidIdentificatorPair createPair(final LispAdjacency data, final int vni,
+ final MappingContext mappingContext) {
+ return new EidIdentificatorPairBuilder()
+ .setLocalEidId(new MappingId(localMappingContext.getId(getArrayAsEidLocal(
+ MappingsDumpParams.EidType.valueOf(data.eidType), data.leid, vni), mappingContext)))
+ .setRemoteEidId(new MappingId(remoteMappingContext.getId(getArrayAsEidLocal(
+ MappingsDumpParams.EidType.valueOf(data.eidType), data.reid, vni), mappingContext)))
+ .build();
+ }
+ }
+
+ private static final class AdjacencyDumpParams {
+
+ private final int vni;
+
+ AdjacencyDumpParams(final int vni) {
+ this.vni = vni;
+ }
+
+ public int getVni() {
+ return this.vni;
+ }
}
}