HONEYCOMB-236 - Unified read/write exceptions
[honeycomb.git] / lisp / lisp2vpp / src / main / java / io / fd / honeycomb / lisp / translate / read / LocalMappingCustomizer.java
index f2a8a85..9a46a92 100755 (executable)
@@ -22,42 +22,38 @@ import static io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsD
 import static io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsDumpParams.FilterType;
 import static io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsDumpParams.MappingsDumpParamsBuilder;
 import static io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsDumpParams.QuantityType;
-import static io.fd.honeycomb.lisp.translate.util.EidConverter.compareAddresses;
-import static io.fd.honeycomb.lisp.translate.util.EidConverter.getArrayAsEidLocal;
-import static io.fd.honeycomb.lisp.translate.util.EidConverter.getEidAsByteArray;
-import static io.fd.honeycomb.lisp.translate.util.EidConverter.getEidType;
-import static io.fd.honeycomb.lisp.translate.util.EidConverter.getPrefixLength;
 
 import com.google.common.base.Optional;
 import io.fd.honeycomb.lisp.context.util.EidMappingContext;
-import io.fd.honeycomb.lisp.translate.read.dump.check.MappingsDumpCheck;
 import io.fd.honeycomb.lisp.translate.read.dump.executor.MappingsDumpExecutor;
 import io.fd.honeycomb.lisp.translate.read.dump.executor.params.MappingsDumpParams;
+import io.fd.honeycomb.lisp.translate.read.trait.MappingFilterProvider;
+import io.fd.honeycomb.lisp.translate.util.EidTranslator;
 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.v3po.util.FutureJVppCustomizer;
-import io.fd.honeycomb.translate.v3po.util.NamingContext;
 import io.fd.honeycomb.translate.util.read.cache.DumpCacheManager;
-import io.fd.honeycomb.translate.util.read.cache.exceptions.execution.DumpExecutionFailedException;
+import io.fd.honeycomb.translate.vpp.util.FutureJVppCustomizer;
+import io.fd.honeycomb.translate.vpp.util.NamingContext;
+import io.fd.vpp.jvpp.core.dto.LispEidTableDetails;
+import io.fd.vpp.jvpp.core.dto.LispEidTableDetailsReplyDump;
+import io.fd.vpp.jvpp.core.future.FutureJVppCore;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.honeycomb.params.xml.ns.yang.eid.mapping.context.rev160801.contexts.eid.mapping.context.mappings.mapping.Eid;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.MappingId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.dp.subtable.grouping.LocalMappingsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.dp.subtable.grouping.local.mappings.LocalMapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.dp.subtable.grouping.local.mappings.LocalMappingBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.dp.subtable.grouping.local.mappings.LocalMappingKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.eid.table.grouping.eid.table.VniTable;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.eid.table.grouping.eid.table.vni.table.LocalMappingsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.eid.table.grouping.eid.table.vni.table.local.mappings.LocalMapping;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.eid.table.grouping.eid.table.vni.table.local.mappings.LocalMappingBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev160520.eid.table.grouping.eid.table.vni.table.local.mappings.LocalMappingKey;
 import org.opendaylight.yangtools.concepts.Builder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.openvpp.jvpp.core.dto.LispEidTableDetails;
-import org.openvpp.jvpp.core.dto.LispEidTableDetailsReplyDump;
-import org.openvpp.jvpp.core.future.FutureJVppCore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,11 +62,13 @@ import org.slf4j.LoggerFactory;
  */
 public class LocalMappingCustomizer
         extends FutureJVppCustomizer
-        implements ListReaderCustomizer<LocalMapping, LocalMappingKey, LocalMappingBuilder> {
+        implements ListReaderCustomizer<LocalMapping, LocalMappingKey, LocalMappingBuilder>, EidTranslator,
+        MappingFilterProvider {
 
     private static final Logger LOG = LoggerFactory.getLogger(LocalMappingCustomizer.class);
     private static final String KEY = LocalMappingCustomizer.class.getName();
 
+
     private final DumpCacheManager<LispEidTableDetailsReplyDump, MappingsDumpParams> dumpManager;
     private final MappingsDumpExecutor dumpExecutor;
     private final NamingContext locatorSetContext;
@@ -85,11 +83,9 @@ public class LocalMappingCustomizer
         this.dumpManager =
                 new DumpCacheManager.DumpCacheManagerBuilder<LispEidTableDetailsReplyDump, MappingsDumpParams>()
                         .withExecutor(dumpExecutor)
-                        .withNonEmptyPredicate(new MappingsDumpCheck())
                         .build();
     }
 
-
     @Override
     public LocalMappingBuilder getBuilder(InstanceIdentifier<LocalMapping> id) {
         return new LocalMappingBuilder();
@@ -120,33 +116,28 @@ public class LocalMappingCustomizer
                 .build();
 
         LOG.debug("Dumping data for LocalMappings(id={})", id);
-        Optional<LispEidTableDetailsReplyDump> replyOptional;
+        final Optional<LispEidTableDetailsReplyDump> replyOptional =
+                dumpManager.getDump(id, bindKey("SPECIFIC_" + localMappingId), ctx.getModificationCache(), dumpParams);
 
-        try {
-            replyOptional =
-                    dumpManager.getDump(bindKey("SPECIFIC_" + localMappingId), ctx.getModificationCache(), dumpParams);
-        } catch (DumpExecutionFailedException e) {
-            throw new ReadFailedException(id, e);
+        if (!replyOptional.isPresent() || replyOptional.get().lispEidTableDetails.isEmpty()) {
+            return;
         }
 
-        if (replyOptional.isPresent()) {
-            LOG.debug("Valid dump loaded");
-
-            LispEidTableDetails details = replyOptional.get().lispEidTableDetails.stream()
-                    .filter(a -> compareAddresses(eid.getAddress(),
-                            getArrayAsEidLocal(valueOf(a.eidType), a.eid).getAddress()))
-                    .collect(
-                            RWUtils.singleItemCollector());
-
-            //in case of local mappings,locator_set_index stands for interface index
-            checkState(locatorSetContext.containsName(details.locatorSetIndex, ctx.getMappingContext()),
-                    "No Locator Set name found for index %s", details.locatorSetIndex);
-            builder.setLocatorSet(locatorSetContext.getName(details.locatorSetIndex, ctx.getMappingContext()));
-            builder.setKey(new LocalMappingKey(new MappingId(id.firstKeyOf(LocalMapping.class).getId())));
-            builder.setEid(getArrayAsEidLocal(valueOf(details.eidType), details.eid));
-        } else {
-            LOG.debug("No data dumped");
-        }
+        LispEidTableDetails details = replyOptional.get().lispEidTableDetails.stream()
+                .filter(subtableFilterForLocalMappings(id))
+                .filter(detail -> compareAddresses(eid.getAddress(), getAddressFromDumpDetail(detail)))
+                .collect(RWUtils.singleItemCollector());
+
+        //in case of local mappings,locator_set_index stands for interface index
+        checkState(locatorSetContext.containsName(details.locatorSetIndex, ctx.getMappingContext()),
+                "No Locator Set name found for index %s", details.locatorSetIndex);
+        builder.setLocatorSet(locatorSetContext.getName(details.locatorSetIndex, ctx.getMappingContext()));
+        builder.setKey(new LocalMappingKey(new MappingId(id.firstKeyOf(LocalMapping.class).getId())));
+        builder.setEid(getArrayAsEidLocal(valueOf(details.eidType), details.eid, details.vni));
+    }
+
+    private Address getAddressFromDumpDetail(final LispEidTableDetails detail) {
+        return getArrayAsEidLocal(valueOf(detail.eidType), detail.eid, detail.vni).getAddress();
     }
 
     @Override
@@ -154,34 +145,38 @@ public class LocalMappingCustomizer
             throws ReadFailedException {
 
         checkState(id.firstKeyOf(VniTable.class) != null, "Parent VNI table not specified");
+        final long vni = id.firstKeyOf(VniTable.class).getVirtualNetworkIdentifier();
+
+        if (vni == 0) {
+            // ignoring default vni mapping
+            // its not relevant for us and we also don't store mapping for such eid's
+            // such mapping is used to create helper local mappings to process remote ones
+            return Collections.emptyList();
+        }
 
         //request for all local mappings
         final MappingsDumpParams dumpParams = new MappingsDumpParamsBuilder()
-                .setVni(Long.valueOf(id.firstKeyOf(VniTable.class).getVirtualNetworkIdentifier()).intValue())
                 .setFilter(FilterType.LOCAL)
                 .setEidSet(QuantityType.ALL)
                 .build();
 
         LOG.debug("Dumping data for LocalMappings(id={})", id);
-        Optional<LispEidTableDetailsReplyDump> replyOptional;
-        try {
-            replyOptional = dumpManager.getDump(bindKey("ALL_LOCAL"), context.getModificationCache(), dumpParams);
-        } catch (DumpExecutionFailedException e) {
-            throw new ReadFailedException(id, e);
-        }
+        final Optional<LispEidTableDetailsReplyDump> replyOptional =
+                dumpManager.getDump(id, bindKey("ALL_LOCAL"), context.getModificationCache(), dumpParams);
 
-        if (replyOptional.isPresent()) {
-            LOG.debug("Valid dump loaded");
-            return replyOptional.get().lispEidTableDetails.stream().map(a -> new LocalMappingKey(
-                    new MappingId(
-                            localMappingContext.getId(
-                                    getArrayAsEidLocal(valueOf(a.eidType), a.eid),
-                                    context.getMappingContext()))))
-                    .collect(Collectors.toList());
-        } else {
-            LOG.debug("No data dumped");
+        if (!replyOptional.isPresent() || replyOptional.get().lispEidTableDetails.isEmpty()) {
             return Collections.emptyList();
         }
+
+
+        return replyOptional.get().lispEidTableDetails.stream()
+                .filter(a -> a.vni == vni)
+                .filter(subtableFilterForLocalMappings(id))
+                .map(detail -> getArrayAsEidLocal(valueOf(detail.eidType), detail.eid, detail.vni))
+                .map(localEid -> localMappingContext.getId(localEid, context.getMappingContext()))
+                .map(MappingId::new)
+                .map(LocalMappingKey::new)
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -192,4 +187,5 @@ public class LocalMappingCustomizer
     private static String bindKey(String prefix) {
         return prefix + "_" + KEY;
     }
+
 }