summaryrefslogtreecommitdiffstats
path: root/lisp/lisp2vpp/src/main/java
diff options
context:
space:
mode:
authorJan Srnicek <jsrnicek@cisco.com>2017-01-12 09:59:30 +0100
committerMarek Gradzki <mgradzki@cisco.com>2017-01-12 09:23:36 +0000
commitfd7cd756fe7e13e0bddde7be8ef7afecd2ba9fb7 (patch)
tree762e9c569f20a3e04fc615b735f0069802e2a233 /lisp/lisp2vpp/src/main/java
parent43a552b675e1c1a8f8cc618f91289cbee8be0ee2 (diff)
HONEYCOMB-296 - Reference checking in Locator set
Reference must be checked while removing to prevent dead references Change-Id: I37cb426f73a3fa64d4e6795062d8d7affc0cbb2b Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
Diffstat (limited to 'lisp/lisp2vpp/src/main/java')
-rwxr-xr-xlisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/LocatorSetCustomizer.java55
1 files changed, 52 insertions, 3 deletions
diff --git a/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/LocatorSetCustomizer.java b/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/LocatorSetCustomizer.java
index b125d4038..8c41372e1 100755
--- a/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/LocatorSetCustomizer.java
+++ b/lisp/lisp2vpp/src/main/java/io/fd/hc2vpp/lisp/translate/write/LocatorSetCustomizer.java
@@ -20,17 +20,29 @@ import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static java.nio.charset.StandardCharsets.UTF_8;
-import io.fd.hc2vpp.lisp.translate.read.trait.LocatorSetReader;
-import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
+import com.google.common.base.Optional;
import io.fd.hc2vpp.common.translate.util.ByteDataTranslator;
import io.fd.hc2vpp.common.translate.util.FutureJVppCustomizer;
import io.fd.hc2vpp.common.translate.util.NamingContext;
+import io.fd.hc2vpp.common.translate.util.ReferenceCheck;
+import io.fd.hc2vpp.lisp.translate.read.trait.LocatorSetReader;
+import io.fd.honeycomb.translate.spi.write.ListWriterCustomizer;
import io.fd.honeycomb.translate.write.WriteContext;
import io.fd.honeycomb.translate.write.WriteFailedException;
import io.fd.vpp.jvpp.core.dto.LispAddDelLocatorSet;
import io.fd.vpp.jvpp.core.future.FutureJVppCore;
+import java.util.Collection;
+import java.util.Collections;
import java.util.List;
+import java.util.stream.Collectors;
import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.DpSubtableGrouping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.Lisp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.LocalMappings;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.dp.subtable.grouping.local.mappings.LocalMapping;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.EidTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.eid.table.grouping.eid.table.VniTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.lisp.feature.data.grouping.LispFeatureData;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.locator.sets.grouping.locator.sets.LocatorSet;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.locator.sets.grouping.locator.sets.LocatorSetKey;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.lisp.rev161214.locator.sets.grouping.locator.sets.locator.set.Interface;
@@ -44,7 +56,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
*/
public class LocatorSetCustomizer extends FutureJVppCustomizer
implements ListWriterCustomizer<LocatorSet, LocatorSetKey>, ByteDataTranslator,
- LocatorSetReader {
+ LocatorSetReader, ReferenceCheck {
private final NamingContext locatorSetContext;
@@ -85,11 +97,48 @@ public class LocatorSetCustomizer extends FutureJVppCustomizer
@Nonnull LocatorSet dataBefore,
@Nonnull WriteContext writeContext) throws WriteFailedException {
final String locatorSetName = dataBefore.getName();
+
+ final Optional<EidTable> eidTableData = writeContext.readAfter(InstanceIdentifier.create(Lisp.class)
+ .child(LispFeatureData.class)
+ .child(EidTable.class));
+
+ if (eidTableData.isPresent()) {
+ // due to non-functional LeafRefValidation, it must be checked like this
+ final List<VniTable> vniTables =
+ Optional.fromNullable(eidTableData.get().getVniTable()).or(Collections.emptyList());
+ checkReferenceExist(id, vrfReferences(vniTables, locatorSetName));
+ checkReferenceExist(id, bdReferences(vniTables, locatorSetName));
+ }
+
addDelLocatorSetAndReply(false, dataBefore.getName(), id);
//removes mapping after successful delete
locatorSetContext.removeName(locatorSetName, writeContext.getMappingContext());
}
+ private Collection<LocalMapping> bdReferences(final List<VniTable> vniTables,
+ final String locatorSetName) {
+ return vniTables.stream()
+ .map(vniTable -> java.util.Optional.ofNullable(vniTable.getBridgeDomainSubtable())
+ .map(DpSubtableGrouping::getLocalMappings)
+ .map(LocalMappings::getLocalMapping)
+ .orElse(Collections.emptyList()))
+ .flatMap(Collection::stream)
+ .filter(localMapping -> locatorSetName.equals(localMapping.getLocatorSet()))
+ .collect(Collectors.toSet());
+ }
+
+ private static Collection<LocalMapping> vrfReferences(final List<VniTable> vniTables,
+ final String locatorSetName) {
+ return vniTables.stream()
+ .map(vniTable -> java.util.Optional.ofNullable(vniTable.getVrfSubtable())
+ .map(DpSubtableGrouping::getLocalMappings)
+ .map(LocalMappings::getLocalMapping)
+ .orElse(Collections.emptyList()))
+ .flatMap(Collection::stream)
+ .filter(localMapping -> locatorSetName.equals(localMapping.getLocatorSet()))
+ .collect(Collectors.toSet());
+ }
+
private int addDelLocatorSetAndReply(final boolean add, final String name, final InstanceIdentifier<LocatorSet> id)
throws WriteFailedException {