HONEYCOMB-38: Fix vpp interface customizers
authorMaros Marsalek <[email protected]>
Thu, 14 Apr 2016 13:22:06 +0000 (15:22 +0200)
committerMarek Gradzki <[email protected]>
Fri, 15 Apr 2016 08:56:42 +0000 (10:56 +0200)
The order of execution was not correct
+ CompositeWriter ignored some changes

Change-Id: I53fd9fda4b7a0379e0fa8451fa894865f67ebace
Signed-off-by: Maros Marsalek <[email protected]>
Signed-off-by: Marek Gradzki <[email protected]>
12 files changed:
v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/read/CompositeListReader.java
v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/AbstractCompositeWriter.java
v3po/translate-impl/src/main/java/io/fd/honeycomb/v3po/translate/impl/write/CompositeChildWriter.java
v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/ReflexiveAugmentWriterCustomizer.java [new file with mode: 0644]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/InterfaceCustomizer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/L2Customizer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/RoutingCustomizer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VppInterfaceCustomizer.java [deleted file]
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VxlanCustomizer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/ip/Ipv4Customizer.java
v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/vppstate/BridgeDomainCustomizer.java
v3po/v3po2vpp/src/main/java/org/opendaylight/yang/gen/v1/urn/honeycomb/params/xml/ns/yang/v3po2vpp/rev160406/InterfacesHoneycombWriterModule.java

index de32ee7..4c84c3a 100644 (file)
@@ -133,9 +133,11 @@ public final class CompositeListReader<C extends DataObject & Identifiable<K>, K
                     RWUtils.getCurrentIdItem(id, key);
             final InstanceIdentifier<C> keyedId = RWUtils.replaceLastInId(id, currentBdItem);
             final Optional<C> read = readCurrent(keyedId, ctx);
-            final DataObject singleItem = read.get();
-            checkArgument(getManagedDataObjectType().getTargetType().isAssignableFrom(singleItem.getClass()));
-            allEntries.add(getManagedDataObjectType().getTargetType().cast(singleItem));
+            if(read.isPresent()) {
+                final DataObject singleItem = read.get();
+                checkArgument(getManagedDataObjectType().getTargetType().isAssignableFrom(singleItem.getClass()));
+                allEntries.add(getManagedDataObjectType().getTargetType().cast(singleItem));
+            }
         }
         return allEntries;
     }
index 1e4d136..603f2a8 100644 (file)
@@ -98,6 +98,7 @@ public abstract class AbstractCompositeWriter<D extends DataObject> implements W
                                  final WriteContext ctx) throws WriteFailedException {
         LOG.debug("{}: Updating current: {} dataBefore: {}, datAfter: {}", this, id, dataBefore, dataAfter);
 
+/*   FIXME: Equals does not work: LINK */
         if (dataBefore.equals(dataAfter)) {
             LOG.debug("{}: Skipping current(no update): {}", this, id);
             // No change, ignore
index 512eb44..54a09f2 100644 (file)
@@ -95,12 +95,12 @@ public class CompositeChildWriter<D extends DataObject> extends AbstractComposit
 
     @Override
     public void deleteChild(@Nonnull final InstanceIdentifier<? extends DataObject> parentId,
-                            @Nonnull final DataObject parentData,
+                            @Nonnull final DataObject parentDataBefore,
                             @Nonnull final WriteContext ctx) throws WriteFailedException {
         final InstanceIdentifier<D> currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType());
-        final Optional<D> currentData = customizer.extract(currentId, parentData);
-        if(currentData.isPresent()) {
-            deleteCurrent(currentId, currentData.get(), ctx);
+        final Optional<D> dataBefore = customizer.extract(currentId, parentDataBefore);
+        if(dataBefore.isPresent()) {
+            deleteCurrent(currentId, dataBefore.get(), ctx);
         }
     }
 
@@ -111,8 +111,15 @@ public class CompositeChildWriter<D extends DataObject> extends AbstractComposit
         final InstanceIdentifier<D> currentId = RWUtils.appendTypeToId(parentId, getManagedDataObjectType());
         final Optional<D> before = customizer.extract(currentId, parentDataBefore);
         final Optional<D> after = customizer.extract(currentId, parentDataAfter);
-        if(before.isPresent() && after.isPresent()) {
-            updateCurrent(currentId, before.get(), after.get(), ctx);
+
+        if(before.isPresent()) {
+            if(after.isPresent()) {
+                updateCurrent(currentId, before.get(), after.get(), ctx);
+            } else {
+                deleteCurrent(currentId, before.get(), ctx);
+            }
+        } else if (after.isPresent()){
+            writeCurrent(currentId, after.get(), ctx);
         }
     }
 }
diff --git a/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/ReflexiveAugmentWriterCustomizer.java b/v3po/translate-utils/src/main/java/io/fd/honeycomb/v3po/translate/util/write/ReflexiveAugmentWriterCustomizer.java
new file mode 100644 (file)
index 0000000..6d29214
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.fd.honeycomb.v3po.translate.util.write;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+
+import com.google.common.base.Optional;
+import io.fd.honeycomb.v3po.translate.spi.write.ChildWriterCustomizer;
+import javax.annotation.Nonnull;
+import org.opendaylight.yangtools.yang.binding.Augmentable;
+import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+
+/**
+ * Might be slow !
+ */
+public class ReflexiveAugmentWriterCustomizer<C extends DataObject> extends NoopWriterCustomizer<C> implements
+    ChildWriterCustomizer<C> {
+
+    @Nonnull
+    @Override
+    @SuppressWarnings("unchecked")
+    public Optional<C> extract(@Nonnull final InstanceIdentifier<C> currentId, @Nonnull final DataObject parentData) {
+        checkArgument(parentData instanceof Augmentable<?>, "Not augmnatable parent object: %s", parentData);
+        final Class<C> currentType = currentId.getTargetType();
+        final Augmentation<?> augmentation = ((Augmentable) parentData).getAugmentation(currentType);
+        if(augmentation == null) {
+            return Optional.absent();
+        } else {
+            checkState(currentType.isAssignableFrom(augmentation.getClass()));
+            return Optional.of(currentType.cast(augmentation));
+        }
+    }
+}
index 6b91e2e..30600d8 100644 (file)
@@ -19,6 +19,9 @@ package io.fd.honeycomb.v3po.translate.v3po.interfaces;
 import io.fd.honeycomb.v3po.translate.Context;
 import io.fd.honeycomb.v3po.translate.spi.write.ListWriterCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.util.VppApiCustomizer;
+import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException;
+import io.fd.honeycomb.v3po.translate.v3po.utils.V3poUtils;
+import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
 import java.util.List;
 import javax.annotation.Nonnull;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces;
@@ -27,14 +30,15 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.openvpp.vppjapi.vppApi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Ietf interface write customizer that only caches interface objects for child writers
  */
 public class InterfaceCustomizer extends VppApiCustomizer implements ListWriterCustomizer<Interface, InterfaceKey> {
 
-    public static final String IFC_AFTER_CTX = InterfaceCustomizer.class.toString() + "ifcAfter";
-    public static final String IFC_BEFORE_CTX = InterfaceCustomizer.class.toString() + "ifcBefore";
+    private static final Logger LOG = LoggerFactory.getLogger(InterfaceCustomizer.class);
 
     public InterfaceCustomizer(final vppApi vppApi) {
         super(vppApi);
@@ -43,24 +47,38 @@ public class InterfaceCustomizer extends VppApiCustomizer implements ListWriterC
     @Override
     public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> id,
                                        @Nonnull final Interface dataAfter,
-                                       @Nonnull final Context writeContext) {
-        writeContext.put(IFC_AFTER_CTX, dataAfter);
+                                       @Nonnull final Context writeContext)
+        throws WriteFailedException {
+
+        try {
+            setInterface(id, dataAfter);
+        } catch (VppApiInvocationException e) {
+            LOG.warn("Update of VppInterfaceAugment failed", e);
+            throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
+        }
     }
 
     @Override
     public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> id,
                                         @Nonnull final Interface dataBefore,
                                         @Nonnull final Interface dataAfter,
-                                        @Nonnull final Context writeContext) {
-        writeContext.put(IFC_BEFORE_CTX, dataBefore);
-        writeContext.put(IFC_AFTER_CTX, dataAfter);
+                                        @Nonnull final Context writeContext)
+        throws WriteFailedException.UpdateFailedException {
+
+        try {
+            updateInterface(id, dataBefore, dataAfter);
+        } catch (VppApiInvocationException e) {
+            LOG.warn("Update of VppInterfaceAugment failed", e);
+            throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
+        }
     }
 
     @Override
     public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Interface> id,
                                         @Nonnull final Interface dataBefore,
                                         @Nonnull final Context writeContext) {
-        writeContext.put(IFC_BEFORE_CTX, dataBefore);
+
+        // TODO Handle deletes
     }
 
     @Nonnull
@@ -69,4 +87,64 @@ public class InterfaceCustomizer extends VppApiCustomizer implements ListWriterC
                                    @Nonnull final DataObject parentData) {
         return ((Interfaces) parentData).getInterface();
     }
+
+
+    private void setInterface(final InstanceIdentifier<Interface> id, final Interface swIf)
+        throws VppApiInvocationException, WriteFailedException {
+        LOG.info("Setting interface {}, type: {}", swIf.getName(), swIf.getType().getSimpleName());
+        LOG.debug("Setting interface {}", swIf);
+
+        String swIfName = swIf.getName();
+        int swIfIndex = getVppApi().swIfIndexFromName(swIfName);
+
+        setInterfaceAttributes(swIf, swIfName);
+    }
+
+    private void setInterfaceAttributes(final Interface swIf, final String swIfName)
+        throws VppApiInvocationException {
+        LOG.debug("Creating {} interface {}", swIf.getType().getSimpleName(), swIf.getName());
+
+        setInterfaceFlags(swIfName, getVppApi().swIfIndexFromName(swIfName),
+            swIf.isEnabled() ? (byte) 1 : (byte) 0);
+
+        setDescription(swIf);
+    }
+
+    private void updateInterface(final InstanceIdentifier<Interface> id,
+                                 final Interface dataBefore,
+                                 final Interface dataAfter) throws VppApiInvocationException {
+        LOG.info("Updating interface {}, type: {}", dataAfter.getName(), dataAfter.getType().getSimpleName());
+        LOG.debug("Updating interface {}", dataAfter);
+
+        String swIfName = dataAfter.getName();
+        int swIfIndex = getVppApi().swIfIndexFromName(swIfName);
+
+        setInterfaceAttributes(dataAfter, swIfName);
+    }
+
+    private void setInterfaceFlags(final String swIfName, final int swIfIndex, final byte enabled)
+        throws VppApiInvocationException {
+        int ctxId = getVppApi().swInterfaceSetFlags(swIfIndex, enabled, enabled, (byte) 0 /* deleted */);
+
+        LOG.debug("Updating interface flags for: {}, index: {}, enabled: {}, ctxId: {}", swIfName, swIfIndex,
+            enabled, ctxId);
+
+        final int rv = V3poUtils.waitForResponse(ctxId, getVppApi());
+        if (rv < 0) {
+            LOG.warn("Failed to update interface flags for: {}, index: {}, enabled: {}, ctxId: {}", swIfName, swIfIndex,
+                enabled, ctxId);
+            throw new VppApiInvocationException("swInterfaceSetFlags", ctxId, rv);
+        } else {
+            LOG.debug("Interface flags updated successfully for: {}, index: {}, enabled: {}, ctxId: {}",
+                swIfName, swIfIndex, enabled, ctxId);
+        }
+    }
+
+    private void setDescription(final Interface swIf) {
+        if (swIf.getDescription() != null) {
+            getVppApi().setInterfaceDescription(swIf.getName(), swIf.getDescription());
+        } else {
+            getVppApi().setInterfaceDescription(swIf.getName(), "");
+        }
+    }
 }
index e596f8f..b9296b4 100644 (file)
@@ -55,11 +55,11 @@ public class L2Customizer extends VppApiCustomizer implements ChildWriterCustomi
     public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataAfter,
                                        @Nonnull final Context writeContext)
         throws WriteFailedException {
-        final Interface ifc = (Interface) writeContext.get(InterfaceCustomizer.IFC_AFTER_CTX);
 
-        final int swIfc = getSwIfc(ifc);
+        final String ifcName = id.firstKeyOf(Interface.class).getName();
+        final int swIfc = getSwIfc(ifcName);
         try {
-            setL2(id, swIfc, ifc, dataAfter);
+            setL2(id, swIfc, ifcName, dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Write of L2 failed", e);
             throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
@@ -70,49 +70,45 @@ public class L2Customizer extends VppApiCustomizer implements ChildWriterCustomi
     public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataBefore,
                                         @Nonnull final L2 dataAfter, @Nonnull final Context writeContext)
         throws WriteFailedException {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-        final Interface ifcAfter = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
 
-        final int swIfc = getSwIfc(ifcBefore);
+        final String ifcName = id.firstKeyOf(Interface.class).getName();
+        final int swIfc = getSwIfc(ifcName);
         // TODO handle update properly (if possible)
         try {
-            setL2(id, swIfc, ifcAfter, dataAfter);
+            setL2(id, swIfc, ifcName, dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Update of L2 failed", e);
             throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
         }
     }
 
-    private int getSwIfc(final Interface ifcBefore) {
-        int swIfcIndex = getVppApi().swIfIndexFromName(ifcBefore.getName());
-        checkArgument(swIfcIndex != -1, "Interface %s does not exist", ifcBefore.getName());
+    private int getSwIfc(final String ifcName) {
+        int swIfcIndex = getVppApi().swIfIndexFromName(ifcName);
+        checkArgument(swIfcIndex != -1, "Interface %s does not exist", ifcName);
         return swIfcIndex;
     }
 
     @Override
     public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<L2> id, @Nonnull final L2 dataBefore,
                                         @Nonnull final Context writeContext) {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-
-        final int swIfc = getSwIfc(ifcBefore);
         // TODO implement delete (if possible)
     }
 
-    private void setL2(final InstanceIdentifier<L2> id, final int swIfIndex, final Interface ifc, final L2 vppL2)
+    private void setL2(final InstanceIdentifier<L2> id, final int swIfIndex, final String ifcName, final L2 vppL2)
         throws VppApiInvocationException, WriteFailedException {
-        LOG.debug("Setting L2 for interface: %s", ifc.getName());
+        LOG.debug("Setting L2 for interface: %s", ifcName);
         // Nothing besides interconnection here
-        setInterconnection(id, swIfIndex, ifc, vppL2);
+        setInterconnection(id, swIfIndex, ifcName, vppL2);
     }
 
-    private void setInterconnection(final InstanceIdentifier<L2> id, final int swIfIndex, final Interface ifc,
+    private void setInterconnection(final InstanceIdentifier<L2> id, final int swIfIndex, final String ifcName,
                                     final L2 vppL2)
         throws VppApiInvocationException, WriteFailedException {
         Interconnection ic = vppL2.getInterconnection();
         if (ic instanceof XconnectBased) {
-            setXconnectBasedL2(swIfIndex, ifc, (XconnectBased) ic);
+            setXconnectBasedL2(swIfIndex, ifcName, (XconnectBased) ic);
         } else if (ic instanceof BridgeBased) {
-            setBridgeBasedL2(swIfIndex, ifc, (BridgeBased) ic);
+            setBridgeBasedL2(swIfIndex, ifcName, (BridgeBased) ic);
         } else {
             // FIXME how does choice extensibility work
             // FIXME it is not even possible to create a dedicated customizer for Interconnection, since it's not a DataObject
@@ -123,16 +119,16 @@ public class L2Customizer extends VppApiCustomizer implements ChildWriterCustomi
         }
     }
 
-    private void setBridgeBasedL2(final int swIfIndex, final Interface ifc, final BridgeBased bb)
+    private void setBridgeBasedL2(final int swIfIndex, final String ifcName, final BridgeBased bb)
         throws VppApiInvocationException {
 
         LOG.debug("Setting bridge based interconnection(bridge-domain=%s) for interface: %s",
-            bb.getBridgeDomain(), ifc.getName());
+            bb.getBridgeDomain(), ifcName);
 
         String bdName = bb.getBridgeDomain();
         int bdId = getVppApi().bridgeDomainIdFromName(bdName);
         checkArgument(bdId > 0, "Unable to set Interconnection for Interface: %s, bridge domain: %s does not exist",
-            ifc.getName(), bdName);
+            ifcName, bdName);
 
         byte bvi = bb.isBridgedVirtualInterface()
             ? (byte) 1
@@ -143,36 +139,36 @@ public class L2Customizer extends VppApiCustomizer implements ChildWriterCustomi
         final int rv = V3poUtils.waitForResponse(ctxId, getVppApi());
 
         if (rv < 0) {
-            LOG.warn("Failed to update bridge based interconnection flags for: {}, interconnection: {}", ifc.getName(),
+            LOG.warn("Failed to update bridge based interconnection flags for: {}, interconnection: {}", ifcName,
                 bb);
             throw new VppApiInvocationException("swInterfaceSetL2Bridge", ctxId, rv);
         } else {
-            LOG.debug("Bridge based interconnection updated successfully for: {}, interconnection: {}", ifc.getName(),
+            LOG.debug("Bridge based interconnection updated successfully for: {}, interconnection: {}", ifcName,
                 bb);
         }
     }
 
-    private void setXconnectBasedL2(final int swIfIndex, final Interface ifc, final XconnectBased ic)
+    private void setXconnectBasedL2(final int swIfIndex, final String ifcName, final XconnectBased ic)
         throws VppApiInvocationException {
 
         String outSwIfName = ic.getXconnectOutgoingInterface();
         LOG.debug("Setting xconnect based interconnection(outgoing ifc=%s) for interface: %s", outSwIfName,
-            ifc.getName());
+            ifcName);
 
         int outSwIfIndex = getVppApi().swIfIndexFromName(outSwIfName);
         checkArgument(outSwIfIndex > 0,
             "Unable to set Interconnection for Interface: %s, outgoing interface: %s does not exist",
-            ifc.getName(), outSwIfIndex);
+            ifcName, outSwIfIndex);
 
         int ctxId = getVppApi().swInterfaceSetL2Xconnect(swIfIndex, outSwIfIndex, (byte) 1 /* enable */);
         final int rv = V3poUtils.waitForResponse(ctxId, getVppApi());
 
         if (rv < 0) {
             LOG.warn("Failed to update xconnect based interconnection flags for: {}, interconnection: {}",
-                ifc.getName(), ic);
+                ifcName, ic);
             throw new VppApiInvocationException("swInterfaceSetL2Xconnect", ctxId, rv);
         } else {
-            LOG.debug("Xconnect based interconnection updated successfully for: {}, interconnection: {}", ifc.getName(),
+            LOG.debug("Xconnect based interconnection updated successfully for: {}, interconnection: {}", ifcName,
                 ic);
         }
     }
index 8d930d8..718afc0 100644 (file)
@@ -53,10 +53,9 @@ public class RoutingCustomizer extends VppApiCustomizer implements ChildWriterCu
     public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Routing> id,
                                        @Nonnull final Routing dataAfter, @Nonnull final Context writeContext)
         throws WriteFailedException.CreateFailedException {
-        final Interface ifc = (Interface) writeContext.get(InterfaceCustomizer.IFC_AFTER_CTX);
 
         try {
-            setRouting(ifc.getName(), dataAfter);
+            setRouting(id.firstKeyOf(Interface.class).getName(), dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Update of Routing failed", e);
             throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
@@ -68,12 +67,10 @@ public class RoutingCustomizer extends VppApiCustomizer implements ChildWriterCu
                                         @Nonnull final Routing dataBefore, @Nonnull final Routing dataAfter,
                                         @Nonnull final Context writeContext)
         throws WriteFailedException.UpdateFailedException {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-        final Interface ifcAfter = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
 
         try {
             // TODO handle updates properly
-            setRouting(ifcAfter.getName(), dataAfter);
+            setRouting(id.firstKeyOf(Interface.class).getName(), dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Update of Routing failed", e);
             throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
diff --git a/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VppInterfaceCustomizer.java b/v3po/v3po2vpp/src/main/java/io/fd/honeycomb/v3po/translate/v3po/interfaces/VppInterfaceCustomizer.java
deleted file mode 100644 (file)
index 3ea3f97..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (c) 2016 Cisco and/or its affiliates.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package io.fd.honeycomb.v3po.translate.v3po.interfaces;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import com.google.common.base.Optional;
-import io.fd.honeycomb.v3po.translate.Context;
-import io.fd.honeycomb.v3po.translate.spi.write.ChildWriterCustomizer;
-import io.fd.honeycomb.v3po.translate.v3po.util.VppApiCustomizer;
-import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException;
-import io.fd.honeycomb.v3po.translate.v3po.utils.V3poUtils;
-import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
-import javax.annotation.Nonnull;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.EthernetCsmacd;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VxlanTunnel;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VppInterfaceCustomizer extends VppApiCustomizer
-    implements ChildWriterCustomizer<VppInterfaceAugmentation> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(VppInterfaceCustomizer.class);
-
-    public VppInterfaceCustomizer(final org.openvpp.vppjapi.vppApi vppApi) {
-        super(vppApi);
-    }
-
-    @Nonnull
-    @Override
-    public Optional<VppInterfaceAugmentation> extract(
-        @Nonnull final InstanceIdentifier<VppInterfaceAugmentation> currentId,
-        @Nonnull final DataObject parentData) {
-        return Optional.fromNullable(((Interface) parentData).getAugmentation(VppInterfaceAugmentation.class));
-    }
-
-    @Override
-    public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<VppInterfaceAugmentation> id,
-                                       @Nonnull final VppInterfaceAugmentation dataAfter,
-                                       @Nonnull final Context writeContext)
-        throws WriteFailedException {
-        final Interface ifc = (Interface) writeContext.get(InterfaceCustomizer.IFC_AFTER_CTX);
-        try {
-            setInterface(id, ifc, dataAfter);
-        } catch (VppApiInvocationException e) {
-            LOG.warn("Update of VppInterfaceAugment failed", e);
-            throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
-        }
-    }
-
-    @Override
-    public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<VppInterfaceAugmentation> id,
-                                        @Nonnull final VppInterfaceAugmentation dataBefore,
-                                        @Nonnull final VppInterfaceAugmentation dataAfter,
-                                        @Nonnull final Context writeContext)
-        throws WriteFailedException.UpdateFailedException {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-        final Interface ifc = (Interface) writeContext.get(InterfaceCustomizer.IFC_AFTER_CTX);
-        try {
-            updateInterface(id, ifc, dataBefore, dataAfter);
-        } catch (VppApiInvocationException e) {
-            LOG.warn("Update of VppInterfaceAugment failed", e);
-            throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
-        }
-    }
-
-    @Override
-    public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<VppInterfaceAugmentation> id,
-                                        @Nonnull final VppInterfaceAugmentation dataBefore,
-                                        @Nonnull final Context writeContext) {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-
-        LOG.info("Deleting interface: {}, type: {}", ifcBefore.getName(), ifcBefore.getType().getSimpleName());
-
-        if (ifcBefore.getType().isAssignableFrom(EthernetCsmacd.class)) {
-            LOG.error("Interface {}, type: {} cannot be deleted",
-                ifcBefore.getName(), ifcBefore.getType().getSimpleName());
-
-        /* FIXME: Add additional interface types here.
-         *
-         * } else if (swIf.getType().isAssignableFrom(*.class)) {
-         */
-
-        }
-    }
-
-
-    private void updateInterface(final InstanceIdentifier<VppInterfaceAugmentation> id, final Interface swIf,
-                                 final VppInterfaceAugmentation dataBefore,
-                                 final VppInterfaceAugmentation dataAfter) throws VppApiInvocationException {
-        LOG.info("Updating interface {}, type: {}", swIf.getName(), swIf.getType().getSimpleName());
-        LOG.debug("Updating interface {}", swIf);
-
-        Class<? extends InterfaceType> ifType = checkNotNull(swIf.getType(), "Interface type missing for %s", swIf);
-        String swIfName = swIf.getName();
-        int swIfIndex = getVppApi().swIfIndexFromName(swIfName);
-        checkArgument(swIfIndex != -1, "Updating non-existing vpp interface: %s", swIfName);
-
-        // TODO handle updates properly
-
-        if (VxlanTunnel.class.isAssignableFrom(ifType)) {
-            updateVxlanTunnelInterface(swIf);
-        } else if (EthernetCsmacd.class.isAssignableFrom(ifType)) {
-            updateEthernetCsmacdInterface(swIf, swIfName, swIfIndex);
-        }
-    }
-
-
-    private void setInterface(final InstanceIdentifier<VppInterfaceAugmentation> id, final Interface swIf,
-                              final VppInterfaceAugmentation dataAfter)
-        throws VppApiInvocationException, WriteFailedException {
-        LOG.info("Setting interface {}, type: {}", swIf.getName(), swIf.getType().getSimpleName());
-        LOG.debug("Setting interface {}", swIf);
-
-        Class<? extends InterfaceType> ifType = checkNotNull(swIf.getType(), "Interface type missing for %s", swIf);
-        String swIfName = swIf.getName();
-        int swIfIndex = getVppApi().swIfIndexFromName(swIfName);
-        checkArgument(swIfIndex == -1, "Creating already-existing vpp interface: %s", swIfName);
-
-        if (VxlanTunnel.class.isAssignableFrom(ifType)) {
-            createVxlanTunnelInterface(swIf, swIfName);
-        } else if (EthernetCsmacd.class.isAssignableFrom(ifType)) {
-            createEthernetCsmacdInterface(id, swIfName, dataAfter);
-        }
-    }
-
-    private void createVxlanTunnelInterface(final Interface swIf, final String swIfName)
-        throws VppApiInvocationException {
-        LOG.debug("Creating {} interface {}", swIf.getType().getSimpleName(), swIf.getName());
-
-        // FIXME, Vxlan child writer needs to be handled before this is
-        int newSwIfIndex = getVppApi().swIfIndexFromName(swIfName);
-
-        setInterfaceFlags(swIfName, newSwIfIndex, swIf.isEnabled()
-            ? (byte) 1
-            : (byte) 0);
-        setDescription(swIf);
-    }
-
-    private void updateVxlanTunnelInterface(final Interface swIf) {
-        LOG.debug("Updating {} interface {}", swIf.getType().getSimpleName(), swIf.getName());
-
-        // TODO handle
-    }
-
-    private void createEthernetCsmacdInterface(final InstanceIdentifier<VppInterfaceAugmentation> id,
-                                               final String swIfName, final VppInterfaceAugmentation dataAfter) throws WriteFailedException {
-        LOG.warn("Unable to create interface: {}, type: {}", swIfName, EthernetCsmacd.class);
-        throw new WriteFailedException.CreateFailedException(id, dataAfter);
-    }
-
-    private void updateEthernetCsmacdInterface(final Interface swIf,
-                                               final String swIfName, final int swIfIndex)
-        throws VppApiInvocationException {
-        LOG.debug("Updating {} interface {}", swIf.getType().getSimpleName(), swIf.getName());
-        byte enabled = swIf.isEnabled()
-            ? (byte) 1
-            : (byte) 0;
-        setInterfaceFlags(swIfName, swIfIndex, enabled);
-        setDescription(swIf);
-    }
-
-    private void setInterfaceFlags(final String swIfName, final int swIfIndex, final byte enabled)
-        throws VppApiInvocationException {
-        int ctxId = getVppApi().swInterfaceSetFlags(swIfIndex, enabled, enabled, (byte) 0 /* deleted */);
-
-        LOG.debug("Updating interface flags for: {}, index: {}, enabled: {}, ctxId: {}", swIfName, swIfIndex,
-            enabled, ctxId);
-
-        final int rv = V3poUtils.waitForResponse(ctxId, getVppApi());
-        if (rv < 0) {
-            LOG.warn("Failed to update interface flags for: {}, index: {}, enabled: {}, ctxId: {}", swIfName, swIfIndex,
-                enabled, ctxId);
-            throw new VppApiInvocationException("swInterfaceSetFlags", ctxId, rv);
-        } else {
-            LOG.debug("Interface flags updated successfully for: {}, index: {}, enabled: {}, ctxId: {}",
-                swIfName, swIfIndex, enabled, ctxId);
-        }
-    }
-
-    private void setDescription(final Interface swIf) {
-        if (swIf.getDescription() != null) {
-            getVppApi().setInterfaceDescription(swIf.getName(), swIf.getDescription());
-        } else {
-            getVppApi().setInterfaceDescription(swIf.getName(), "");
-        }
-    }
-
-}
-
index 2b2774e..dbf8cb0 100644 (file)
@@ -18,9 +18,9 @@ package io.fd.honeycomb.v3po.translate.v3po.interfaces;
 
 import com.google.common.base.Optional;
 import io.fd.honeycomb.v3po.translate.Context;
-import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException;
 import io.fd.honeycomb.v3po.translate.spi.write.ChildWriterCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.util.VppApiCustomizer;
+import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException;
 import io.fd.honeycomb.v3po.translate.v3po.utils.V3poUtils;
 import io.fd.honeycomb.v3po.translate.write.WriteFailedException;
 import javax.annotation.Nonnull;
@@ -54,9 +54,8 @@ public class VxlanCustomizer extends VppApiCustomizer implements ChildWriterCust
     public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Vxlan> id, @Nonnull final Vxlan dataAfter,
                                        @Nonnull final Context writeContext)
         throws WriteFailedException.CreateFailedException {
-        final Interface ifc = (Interface) writeContext.get(InterfaceCustomizer.IFC_AFTER_CTX);
         try {
-            createVxlanTunnel(ifc.getName(), dataAfter);
+            createVxlanTunnel(id.firstKeyOf(Interface.class).getName(), dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Write of Vxlan failed", e);
             throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
@@ -67,12 +66,10 @@ public class VxlanCustomizer extends VppApiCustomizer implements ChildWriterCust
     public void updateCurrentAttributes(@Nonnull final InstanceIdentifier<Vxlan> id, @Nonnull final Vxlan dataBefore,
                                         @Nonnull final Vxlan dataAfter, @Nonnull final Context writeContext)
         throws WriteFailedException.UpdateFailedException {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-        final Interface ifcAfter = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
 
         // TODO handle update in a better way
         try {
-            createVxlanTunnel(ifcAfter.getName(), dataAfter);
+            createVxlanTunnel(id.firstKeyOf(Interface.class).getName(), dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Update of L2 failed", e);
             throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
@@ -82,7 +79,6 @@ public class VxlanCustomizer extends VppApiCustomizer implements ChildWriterCust
     @Override
     public void deleteCurrentAttributes(@Nonnull final InstanceIdentifier<Vxlan> id, @Nonnull final Vxlan dataBefore,
                                         @Nonnull final Context writeContext) {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
 
         // TODO handle delete
     }
index 08974fe..8349ebb 100644 (file)
@@ -22,7 +22,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import com.google.common.base.Optional;
 import io.fd.honeycomb.v3po.translate.Context;
 import io.fd.honeycomb.v3po.translate.spi.write.ChildWriterCustomizer;
-import io.fd.honeycomb.v3po.translate.v3po.interfaces.InterfaceCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.util.VppApiCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.util.VppApiInvocationException;
 import io.fd.honeycomb.v3po.translate.v3po.utils.V3poUtils;
@@ -59,10 +58,9 @@ public class Ipv4Customizer extends VppApiCustomizer implements ChildWriterCusto
     public void writeCurrentAttributes(@Nonnull final InstanceIdentifier<Ipv4> id,
                                        @Nonnull final Ipv4 dataAfter, @Nonnull final Context writeContext)
         throws WriteFailedException {
-        final Interface ifc = (Interface) writeContext.get(InterfaceCustomizer.IFC_AFTER_CTX);
-
         try {
-            setIpv4(id, ifc.getName(), dataAfter);
+            final String ifcName = id.firstKeyOf(Interface.class).getName();
+            setIpv4(id, ifcName, dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Create of Ipv4 failed", e);
             throw new WriteFailedException.CreateFailedException(id, dataAfter, e);
@@ -74,12 +72,11 @@ public class Ipv4Customizer extends VppApiCustomizer implements ChildWriterCusto
                                         @Nonnull final Ipv4 dataBefore, @Nonnull final Ipv4 dataAfter,
                                         @Nonnull final Context writeContext)
         throws WriteFailedException {
-        final Interface ifcBefore = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
-        final Interface ifcAfter = (Interface) writeContext.get(InterfaceCustomizer.IFC_BEFORE_CTX);
+        final String ifcName = id.firstKeyOf(Interface.class).getName();
 
         // TODO handle update in a better way
         try {
-            setIpv4(id, ifcAfter.getName(), dataAfter);
+            setIpv4(id, ifcName, dataAfter);
         } catch (VppApiInvocationException e) {
             LOG.warn("Update of Ipv4 failed", e);
             throw new WriteFailedException.UpdateFailedException(id, dataBefore, dataAfter, e);
index e0c193f..61c345b 100644 (file)
@@ -59,13 +59,16 @@ public final class BridgeDomainCustomizer extends VppApiCustomizer
                 id, builder, context);
 
         final BridgeDomainKey key = id.firstKeyOf(id.getTargetType());
-        // TODO find out if bd exists based on name and if not return
         LOG.debug("vppstate.BridgeDomainCustomizer.readCurrentAttributes: key={}", key);
 
         final int bdId = getVppApi().bridgeDomainIdFromName(key.getName());
         LOG.debug("vppstate.BridgeDomainCustomizer.readCurrentAttributes: bdId={}", bdId);
 
         final vppBridgeDomainDetails bridgeDomainDetails = getVppApi().getBridgeDomainDetails(bdId);
+        if(bridgeDomainDetails == null) {
+            LOG.debug("Bridge domain name={} does not exist", key.getName());
+            return;
+        }
         logBridgeDomainDetails(bridgeDomainDetails);
 
         builder.setName(key.getName());
index 4710d9e..e906167 100644 (file)
@@ -8,12 +8,11 @@ import io.fd.honeycomb.v3po.translate.impl.write.CompositeRootWriter;
 import io.fd.honeycomb.v3po.translate.util.RWUtils;
 import io.fd.honeycomb.v3po.translate.util.write.CloseableWriter;
 import io.fd.honeycomb.v3po.translate.util.write.NoopWriterCustomizer;
-import io.fd.honeycomb.v3po.translate.util.write.ReflexiveChildWriterCustomizer;
+import io.fd.honeycomb.v3po.translate.util.write.ReflexiveAugmentWriterCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.EthernetCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.InterfaceCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.L2Customizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.RoutingCustomizer;
-import io.fd.honeycomb.v3po.translate.v3po.interfaces.VppInterfaceCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.VxlanCustomizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.ip.Ipv4Customizer;
 import io.fd.honeycomb.v3po.translate.v3po.interfaces.ip.Ipv6Customizer;
@@ -52,11 +51,15 @@ public class InterfacesHoneycombWriterModule extends org.opendaylight.yang.gen.v
 
         final List<ChildWriter<? extends Augmentation<Interface>>> ifcAugmentations = Lists.newArrayList();
         ifcAugmentations.add(getVppIfcAugmentationWriter());
+        ifcAugmentations.add(getInterface1AugmentationWriter());
 
         final ChildWriter<Interface> interfaceWriter = new CompositeListWriter<>(Interface.class,
             RWUtils.<Interface>emptyChildWriterList(),
             ifcAugmentations,
-            new InterfaceCustomizer(getVppJapiIfcDependency()));
+            new InterfaceCustomizer(getVppJapiIfcDependency()),
+            // It's important that this customizer is handled in a postorder way, because you first have to handle child nodes
+            // e.g. Vxlan before setting other interface or vppInterfaceAugmentation leaves
+            TraversalType.POSTORDER);
 
         final List<ChildWriter<? extends ChildOf<Interfaces>>> childWriters = new ArrayList<>();
         childWriters.add(interfaceWriter);
@@ -79,7 +82,7 @@ public class InterfacesHoneycombWriterModule extends org.opendaylight.yang.gen.v
         interface1ChildWriters.add(ipv6Writer);
 
         return new CompositeChildWriter<>(Interface1.class,
-            interface1ChildWriters, new ReflexiveChildWriterCustomizer<Interface1>());
+            interface1ChildWriters, new ReflexiveAugmentWriterCustomizer<Interface1>());
     }
 
     private ChildWriter<VppInterfaceAugmentation> getVppIfcAugmentationWriter() {
@@ -98,17 +101,14 @@ public class InterfacesHoneycombWriterModule extends org.opendaylight.yang.gen.v
 
         final List<ChildWriter<? extends ChildOf<VppInterfaceAugmentation>>> vppIfcChildWriters = Lists.newArrayList();
         // TODO what's the order here ?
-        vppIfcChildWriters.add(ethernetWriter);
         vppIfcChildWriters.add(vxlanWriter);
+        vppIfcChildWriters.add(ethernetWriter);
         vppIfcChildWriters.add(l2Writer);
         vppIfcChildWriters.add(routingWriter);
 
         return new CompositeChildWriter<>(VppInterfaceAugmentation.class,
             vppIfcChildWriters,
             RWUtils.<VppInterfaceAugmentation>emptyAugWriterList(),
-            new VppInterfaceCustomizer(getVppJapiIfcDependency()),
-            // It's important that this customizer is handled in a postorder way, because you first have to handle child nodes
-            // e.g. Vxlan before setting other interface or vppInterfaceAugmentation leaves
-            TraversalType.POSTORDER);
+            new ReflexiveAugmentWriterCustomizer<VppInterfaceAugmentation>());
     }
 }