Tap Port implementation in VPP renderer 80/41380/14
authorMichal Cmarada <mcmarada@cisco.com>
Fri, 15 Jul 2016 06:47:11 +0000 (08:47 +0200)
committerTomas Cechvala <tcechval@cisco.com>
Tue, 19 Jul 2016 09:28:46 +0000 (09:28 +0000)
Change-Id: I210368f121722d13703a6d0810f44ccab1e5ea02
Signed-off-by: Michal Cmarada <mcmarada@cisco.com>
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/AbstractInterfaceCommand.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/ConfigCommand.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/TapPortCommand.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/VhostUserCommand.java
renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/iface/InterfaceManager.java
renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/TapPortCommandTest.java [new file with mode: 0644]

index 049363119dd66cfec0c0aca6d2092fff2e7201af..9bf717d5c38796f57370e764ccadd579a5dd8ad1 100644 (file)
-/*\r
- * Copyright (c) 2016 Cisco Systems. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;\r
-\r
-import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;\r
-\r
-public abstract class AbstractInterfaceCommand<T extends AbstractInterfaceCommand<T>> implements ConfigCommand {\r
-\r
-    protected General.Operations operation;\r
-    protected String name;\r
-    protected String description;\r
-    protected Boolean enabled;\r
-\r
-    protected enum linkUpDownTrap {\r
-        ENABLED, DISABLED\r
-    }\r
-\r
-    public General.Operations getOperation() {\r
-        return operation;\r
-    }\r
-\r
-    public String getName() {\r
-        return name;\r
-    }\r
-\r
-    public String getDescription() {\r
-        return description;\r
-    }\r
-\r
-    public AbstractInterfaceCommand<T> setDescription(String description) {\r
-        this.description = description;\r
-        return this;\r
-    }\r
-\r
-    public Boolean getEnabled() {\r
-        return enabled;\r
-    }\r
-\r
-    public AbstractInterfaceCommand<T> setEnabled(Boolean enabled) {\r
-        this.enabled = enabled;\r
-        return this;\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (c) 2016 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
+
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractInterfaceCommand<T extends AbstractInterfaceCommand<T>> implements ConfigCommand {
+
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractInterfaceCommand.class);
+
+    protected General.Operations operation;
+    protected String name;
+    protected String description;
+    protected Boolean enabled;
+
+    protected enum linkUpDownTrap {
+        ENABLED, DISABLED
+    }
+
+    public General.Operations getOperation() {
+        return operation;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public AbstractInterfaceCommand<T> setDescription(String description) {
+        this.description = description;
+        return this;
+    }
+
+    public Boolean getEnabled() {
+        return enabled;
+    }
+
+    public AbstractInterfaceCommand<T> setEnabled(Boolean enabled) {
+        this.enabled = enabled;
+        return this;
+    }
+
+    public void execute(ReadWriteTransaction rwTx) {
+        switch (getOperation()) {
+            case PUT:
+                LOG.debug("Executing Add operations for command: {}", this);
+                put(rwTx);
+                break;
+            case DELETE:
+                LOG.debug("Executing Delete operations for command: {}", this);
+                delete(rwTx);
+                break;
+            case MERGE:
+                LOG.debug("Executing Update operations for command: {}", this);
+                merge(rwTx);
+                break;
+            default:
+                LOG.error("Execution failed for command: {}", this);
+                break;
+        }
+    }
+
+    private void put(ReadWriteTransaction rwTx) {
+        InterfaceBuilder interfaceBuilder = getInterfaceBuilder();
+
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(interfaceBuilder.getKey()),
+                interfaceBuilder.build(), true);
+    }
+
+    private void merge(ReadWriteTransaction rwTx) {
+        InterfaceBuilder interfaceBuilder = getInterfaceBuilder();
+
+        rwTx.merge(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(interfaceBuilder.getKey()),
+                interfaceBuilder.build());
+    }
+
+    private void delete(ReadWriteTransaction readWriteTransaction) {
+        try {
+            readWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION,
+                    VppIidFactory.getInterfaceIID(new InterfaceKey(name)));
+        } catch (IllegalStateException ex) {
+            LOG.debug("Interface is not present in DS {}", this, ex);
+        }
+
+    }
+}
index cd8b690fd142a9aed7899d09444adc72290e3876..e76c2cef26b327dac58346d5c802b41f74419f4a 100644 (file)
@@ -1,22 +1,29 @@
-/*\r
- * Copyright (c) 2016 Cisco Systems. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
-\r
-public interface ConfigCommand {\r
-\r
-    /**\r
-     * Execute command using a given data modification transaction\r
-     *\r
-     * @param readWriteTransaction Transaction for command execution\r
-     */\r
-    void execute(ReadWriteTransaction readWriteTransaction);\r
-\r
-}\r
+/*
+ * Copyright (c) 2016 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
+
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+
+public interface ConfigCommand {
+
+    /**
+     * Execute command using a given data modification transaction.
+     *
+     * @param readWriteTransaction Transaction for command execution
+     */
+    void execute(ReadWriteTransaction readWriteTransaction);
+
+    /**
+     * Creates Interface Builder with proper augmentations.
+     *
+     * @return InterfaceBuilder for this command with proper augmentations
+     */
+    InterfaceBuilder getInterfaceBuilder();
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/TapPortCommand.java b/renderers/vpp/src/main/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/TapPortCommand.java
new file mode 100644 (file)
index 0000000..c1e177b
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2016 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General.Operations;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Tap;
+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.VppInterfaceAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.TapBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBasedBuilder;
+
+public class TapPortCommand extends AbstractInterfaceCommand<TapPortCommand> {
+
+    private String tapName;
+    private PhysAddress physAddress;
+    private String bridgeDomain;
+    private Long deviceInstance;
+
+    private TapPortCommand(TapPortCommandBuilder builder) {
+        this.name = builder.getInterfaceName();
+        this.tapName = builder.getTapName();
+        this.operation = builder.getOperation();
+        this.physAddress = builder.getPhysAddress();
+        this.enabled = builder.isEnabled();
+        this.description = builder.getDescription();
+        this.bridgeDomain = builder.getBridgeDomain();
+        this.deviceInstance = builder.getDeviceInstance();
+    }
+
+    public static TapPortCommandBuilder builder() {
+        return new TapPortCommandBuilder();
+    }
+
+    public PhysAddress getPhysAddress() {
+        return physAddress;
+    }
+
+    public String getBridgeDomain() {
+        return bridgeDomain;
+    }
+
+    public Long getDeviceInstance() {
+        return deviceInstance;
+    }
+
+    public String getTapName() {
+        return tapName;
+    }
+
+    @Override
+    public InterfaceBuilder getInterfaceBuilder() {
+        InterfaceBuilder interfaceBuilder = new InterfaceBuilder().setKey(new InterfaceKey(name))
+            .setEnabled(enabled)
+            .setDescription(description)
+            .setType(Tap.class)
+            .setName(name)
+            .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);
+
+        // Create the Tap augmentation
+        VppInterfaceAugmentationBuilder vppAugmentationBuilder =
+                new VppInterfaceAugmentationBuilder().setTap(new TapBuilder().setMac(this.physAddress)
+                    .setTapName(this.tapName)
+                    .setMac(this.physAddress)
+                    .setDeviceInstance(this.deviceInstance)
+                    .build());
+
+        if (!Strings.isNullOrEmpty(bridgeDomain)) {
+            vppAugmentationBuilder.setL2(new L2Builder()
+                .setInterconnection(new BridgeBasedBuilder().setBridgeDomain(bridgeDomain).build()).build());
+        }
+
+        interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build());
+        return interfaceBuilder;
+    }
+
+    @Override
+    public String toString() {
+        return "TapPortUserCommand [physAddress=" + physAddress + ", bridgeDomain=" + bridgeDomain + ", operations="
+                + operation + ", name=" + name + ", tapName=" + tapName + ", description=" + description + ", enabled="
+                + enabled + "]";
+    }
+
+    public static class TapPortCommandBuilder {
+
+        private String interfaceName;
+        private String tapName;
+        private Operations operation;
+        private PhysAddress physAddress;
+        private String bridgeDomain;
+        private String description;
+        private Long deviceInstance = null;
+        private boolean enabled = true;
+
+        public String getInterfaceName() {
+            return interfaceName;
+        }
+
+        public TapPortCommandBuilder setInterfaceName(String interfaceName) {
+            this.interfaceName = interfaceName;
+            return this;
+        }
+
+        public String getTapName() {
+            return tapName;
+        }
+
+        public TapPortCommandBuilder setTapName(String tapName) {
+            this.tapName = tapName;
+            return this;
+        }
+
+        public General.Operations getOperation() {
+            return operation;
+        }
+
+        public TapPortCommandBuilder setOperation(Operations operation) {
+            this.operation = operation;
+            return this;
+        }
+
+        public PhysAddress getPhysAddress() {
+            return physAddress;
+        }
+
+        public TapPortCommandBuilder setPhysAddress(PhysAddress physAddress) {
+            this.physAddress = physAddress;
+            return this;
+        }
+
+        public String getBridgeDomain() {
+            return bridgeDomain;
+        }
+
+        public TapPortCommandBuilder setBridgeDomain(String bridgeDomain) {
+            this.bridgeDomain = bridgeDomain;
+            return this;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public TapPortCommandBuilder setDescription(String description) {
+            this.description = description;
+            return this;
+        }
+
+        public Long getDeviceInstance() {
+            return deviceInstance;
+        }
+
+        public TapPortCommandBuilder setDeviceInstance(Long deviceInstance) {
+            this.deviceInstance = deviceInstance;
+            return this;
+        }
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public TapPortCommandBuilder setEnabled(boolean enabled) {
+            this.enabled = enabled;
+            return this;
+        }
+
+        /**
+         * TapPortCommand build method.
+         *
+         * @return TapPortCommand
+         * @throws IllegalArgumentException if interfaceName, tapName or operation is null.
+         */
+        public TapPortCommand build() {
+            Preconditions.checkArgument(this.interfaceName != null);
+            Preconditions.checkArgument(this.tapName != null);
+            Preconditions.checkArgument(this.operation != null);
+
+            return new TapPortCommand(this);
+        }
+    }
+}
index b5c827763ed07474deea163c5cd463eace464c54..f72452490485e63aca917952777e14f71b2a8969 100644 (file)
-/*\r
- * Copyright (c) 2016 Cisco Systems. All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-\r
-package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;\r
-\r
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;\r
-import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General.Operations;\r
-import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUserRole;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentationBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUserBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBasedBuilder;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import com.google.common.base.Preconditions;\r
-import com.google.common.base.Strings;\r
-\r
-public class VhostUserCommand extends AbstractInterfaceCommand<VhostUserCommand> {\r
-\r
-    private static final Logger LOG = LoggerFactory.getLogger(VhostUserCommand.class);\r
-    private String socket;\r
-    private VhostUserRole role;\r
-    private String bridgeDomain;\r
-\r
-    private VhostUserCommand(VhostUserCommandBuilder builder) {\r
-        this.name = builder.getName();\r
-        this.operation = builder.getOperation();\r
-        this.socket = builder.getSocket();\r
-        this.role = builder.getRole();\r
-        this.enabled = builder.isEnabled();\r
-        this.description = builder.getDescription();\r
-        this.bridgeDomain = builder.getBridgeDomain();\r
-\r
-    }\r
-\r
-    public static VhostUserCommandBuilder builder() {\r
-        return new VhostUserCommandBuilder();\r
-    }\r
-\r
-    public String getSocket() {\r
-        return socket;\r
-    }\r
-\r
-    public VhostUserRole getRole() {\r
-        return role;\r
-    }\r
-\r
-    public String getBridgeDomain() {\r
-        return bridgeDomain;\r
-    }\r
-\r
-    @Override\r
-    public void execute(ReadWriteTransaction readWriteTransaction) {\r
-        switch (getOperation()) {\r
-\r
-            case PUT:\r
-                LOG.debug("Executing Add operation for command: {}", this);\r
-                put(readWriteTransaction);\r
-                break;\r
-            case DELETE:\r
-                LOG.debug("Executing Delete operation for command: {}", this);\r
-                delete(readWriteTransaction);\r
-                break;\r
-            case MERGE:\r
-                LOG.debug("Executing Update operation for command: {}", this);\r
-                merge(readWriteTransaction);\r
-                break;\r
-            default:\r
-                LOG.error("Execution failed for command: {}", this);\r
-                break;\r
-        }\r
-    }\r
-\r
-    private void put(ReadWriteTransaction readWriteTransaction) {\r
-        InterfaceBuilder interfaceBuilder = getVhostUserInterfaceBuilder();\r
-\r
-        readWriteTransaction.put(LogicalDatastoreType.CONFIGURATION,\r
-                VppIidFactory.getInterfaceIID(interfaceBuilder.getKey()), interfaceBuilder.build(), true);\r
-    }\r
-\r
-    private void merge(ReadWriteTransaction readWriteTransaction) {\r
-        InterfaceBuilder interfaceBuilder = getVhostUserInterfaceBuilder();\r
-\r
-            readWriteTransaction.merge(LogicalDatastoreType.CONFIGURATION,\r
-                    VppIidFactory.getInterfaceIID(interfaceBuilder.getKey()), interfaceBuilder.build());\r
-    }\r
-\r
-    private InterfaceBuilder getVhostUserInterfaceBuilder() {\r
-        InterfaceBuilder interfaceBuilder =\r
-                new InterfaceBuilder().setKey(new InterfaceKey(name))\r
-                        .setEnabled(enabled)\r
-                        .setDescription(description)\r
-                        .setType(\r
-                                org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUser.class)\r
-                        .setName(name)\r
-                        .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);\r
-\r
-        // Create the vhost augmentation\r
-        VppInterfaceAugmentationBuilder vppAugmentationBuilder = new VppInterfaceAugmentationBuilder()\r
-            .setVhostUser(new VhostUserBuilder().setRole(role).setSocket(socket).build());\r
-        if (!Strings.isNullOrEmpty(bridgeDomain)) {\r
-            vppAugmentationBuilder.setL2(new L2Builder()\r
-                .setInterconnection(new BridgeBasedBuilder().setBridgeDomain(bridgeDomain).build()).build());\r
-        }\r
-\r
-        interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build());\r
-        return interfaceBuilder;\r
-    }\r
-\r
-    private void delete(ReadWriteTransaction readWriteTransaction) {\r
-        try {\r
-            readWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION,\r
-                    VppIidFactory.getInterfaceIID(new InterfaceKey(name)));\r
-        } catch (IllegalStateException ex) {\r
-            LOG.debug("Vhost Interface is not present in DS", ex);\r
-        }\r
-\r
-    }\r
-\r
-    @Override\r
-    public String toString() {\r
-        return "VhostUserCommand [socket=" + socket + ", role=" + role + ", bridgeDomain=" + bridgeDomain\r
-                + ", operation=" + operation + ", name=" + name + ", description=" + description + ", enabled="\r
-                + enabled + "]";\r
-    }\r
-\r
-\r
-\r
-    public static class VhostUserCommandBuilder {\r
-\r
-        private String name;\r
-        private General.Operations operation;\r
-        private String socket;\r
-        private VhostUserRole role = VhostUserRole.Server;\r
-        private boolean enabled = true;\r
-        private String description;\r
-        private String bridgeDomain;\r
-\r
-        public String getName() {\r
-            return name;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setName(String name) {\r
-            this.name = name;\r
-            return this;\r
-        }\r
-\r
-        public General.Operations getOperation() {\r
-            return operation;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setOperation(General.Operations operation) {\r
-            this.operation = operation;\r
-            return this;\r
-        }\r
-\r
-        public String getSocket() {\r
-            return socket;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setSocket(String socket) {\r
-            this.socket = socket;\r
-            return this;\r
-        }\r
-\r
-        public VhostUserRole getRole() {\r
-            return role;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setRole(VhostUserRole role) {\r
-            this.role = role;\r
-            return this;\r
-        }\r
-\r
-        public boolean isEnabled() {\r
-            return enabled;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setEnabled(boolean enabled) {\r
-            this.enabled = enabled;\r
-            return this;\r
-        }\r
-\r
-        public String getDescription() {\r
-            return description;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setDescription(String description) {\r
-            this.description = description;\r
-            return this;\r
-        }\r
-\r
-        public String getBridgeDomain() {\r
-            return bridgeDomain;\r
-        }\r
-\r
-        public VhostUserCommandBuilder setBridgeDomain(String bridgeDomain) {\r
-            this.bridgeDomain = bridgeDomain;\r
-            return this;\r
-        }\r
-\r
-        /**\r
-         * VhostUserCommand build method.\r
-         *\r
-         * @return VhostUserCommand\r
-         * @throws IllegalArgumentException if name, operation or socket is null.\r
-         */\r
-        public VhostUserCommand build() {\r
-            Preconditions.checkArgument(this.name != null);\r
-            Preconditions.checkArgument(this.operation != null);\r
-            if (operation == Operations.PUT) {\r
-                Preconditions.checkArgument(this.socket != null);\r
-            }\r
-\r
-            return new VhostUserCommand(this);\r
-        }\r
-    }\r
-}\r
+/*
+ * Copyright (c) 2016 Cisco Systems. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;
+
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General.Operations;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUserRole;
+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.VppInterfaceAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.VhostUserBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBasedBuilder;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
+
+public class VhostUserCommand extends AbstractInterfaceCommand<VhostUserCommand> {
+
+    private String socket;
+    private VhostUserRole role;
+    private String bridgeDomain;
+
+    private VhostUserCommand(VhostUserCommandBuilder builder) {
+        this.name = builder.getName();
+        this.operation = builder.getOperation();
+        this.socket = builder.getSocket();
+        this.role = builder.getRole();
+        this.enabled = builder.isEnabled();
+        this.description = builder.getDescription();
+        this.bridgeDomain = builder.getBridgeDomain();
+
+    }
+
+    public static VhostUserCommandBuilder builder() {
+        return new VhostUserCommandBuilder();
+    }
+
+    public String getSocket() {
+        return socket;
+    }
+
+    public VhostUserRole getRole() {
+        return role;
+    }
+
+    public String getBridgeDomain() {
+        return bridgeDomain;
+    }
+
+    @Override
+    public InterfaceBuilder getInterfaceBuilder() {
+        InterfaceBuilder interfaceBuilder =
+                new InterfaceBuilder().setKey(new InterfaceKey(name))
+                    .setEnabled(enabled)
+                    .setDescription(description)
+                    .setType(
+                            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUser.class)
+                    .setName(name)
+                    .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);
+
+        // Create the vhost augmentation
+        VppInterfaceAugmentationBuilder vppAugmentationBuilder = new VppInterfaceAugmentationBuilder()
+            .setVhostUser(new VhostUserBuilder().setRole(role).setSocket(socket).build());
+        if (!Strings.isNullOrEmpty(bridgeDomain)) {
+            vppAugmentationBuilder.setL2(new L2Builder()
+                .setInterconnection(new BridgeBasedBuilder().setBridgeDomain(bridgeDomain).build()).build());
+        }
+
+        interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build());
+        return interfaceBuilder;
+    }
+
+    @Override
+    public String toString() {
+        return "VhostUserCommand [socket=" + socket + ", role=" + role + ", bridgeDomain=" + bridgeDomain
+                + ", operation=" + operation + ", name=" + name + ", description=" + description + ", enabled="
+                + enabled + "]";
+    }
+
+    public static class VhostUserCommandBuilder {
+
+        private String name;
+        private General.Operations operation;
+        private String socket;
+        private VhostUserRole role = VhostUserRole.Server;
+        private boolean enabled = true;
+        private String description;
+        private String bridgeDomain;
+
+        public String getName() {
+            return name;
+        }
+
+        public VhostUserCommandBuilder setName(String name) {
+            this.name = name;
+            return this;
+        }
+
+        public General.Operations getOperation() {
+            return operation;
+        }
+
+        public VhostUserCommandBuilder setOperation(General.Operations operation) {
+            this.operation = operation;
+            return this;
+        }
+
+        public String getSocket() {
+            return socket;
+        }
+
+        public VhostUserCommandBuilder setSocket(String socket) {
+            this.socket = socket;
+            return this;
+        }
+
+        public VhostUserRole getRole() {
+            return role;
+        }
+
+        public VhostUserCommandBuilder setRole(VhostUserRole role) {
+            this.role = role;
+            return this;
+        }
+
+        public boolean isEnabled() {
+            return enabled;
+        }
+
+        public VhostUserCommandBuilder setEnabled(boolean enabled) {
+            this.enabled = enabled;
+            return this;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public VhostUserCommandBuilder setDescription(String description) {
+            this.description = description;
+            return this;
+        }
+
+        public String getBridgeDomain() {
+            return bridgeDomain;
+        }
+
+        public VhostUserCommandBuilder setBridgeDomain(String bridgeDomain) {
+            this.bridgeDomain = bridgeDomain;
+            return this;
+        }
+
+        /**
+         * VhostUserCommand build method.
+         *
+         * @return VhostUserCommand
+         * @throws IllegalArgumentException if name, operation or socket is null.
+         */
+        public VhostUserCommand build() {
+            Preconditions.checkArgument(this.name != null);
+            Preconditions.checkArgument(this.operation != null);
+            if (operation == Operations.PUT) {
+                Preconditions.checkArgument(this.socket != null);
+            }
+
+            return new VhostUserCommand(this);
+        }
+    }
+}
index 5340f929865337cc066ffb7c5e022fb1a4b2718a..12feb37765bd1619ca2716eaf65f35b21a9a3dd2 100644 (file)
@@ -19,6 +19,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.ConfigCommand;
+import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.TapPortCommand;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.VhostUserCommand;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.commands.VhostUserCommand.VhostUserCommandBuilder;
 import org.opendaylight.groupbasedpolicy.renderer.vpp.event.NodeOperEvent;
@@ -33,6 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpo
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.VppEndpoint;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint.InterfaceTypeChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.TapCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.vpp.endpoint._interface.type.choice.VhostUserCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VhostUserRole;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;
@@ -61,7 +63,8 @@ public class InterfaceManager implements AutoCloseable {
     private final VppEndpointLocationProvider vppEndpointLocationProvider;
     private final ExecutorService netconfWorker;
 
-    public InterfaceManager(@Nonnull MountedDataBrokerProvider mountDataProvider, @Nonnull DataBroker dataProvider, @Nonnull ExecutorService netconfWorker) {
+    public InterfaceManager(@Nonnull MountedDataBrokerProvider mountDataProvider, @Nonnull DataBroker dataProvider,
+            @Nonnull ExecutorService netconfWorker) {
         this.mountDataProvider = Preconditions.checkNotNull(mountDataProvider);
         this.netconfWorker = Preconditions.checkNotNull(netconfWorker);
         this.vppEndpointLocationProvider = new VppEndpointLocationProvider(dataProvider);
@@ -83,14 +86,21 @@ public class InterfaceManager implements AutoCloseable {
                     break;
             }
         } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to update Vpp Endpoint. {}", e);
-            e.printStackTrace();
+            LOG.error("Failed to update Vpp Endpoint. {}", event, e);
         }
     }
 
     private ListenableFuture<Void> vppEndpointCreated(VppEndpoint vppEndpoint) {
-        Optional<ConfigCommand> potentialIfaceCommand = createInterfaceWithoutBdCommand(vppEndpoint, Operations.PUT);
+        InterfaceTypeChoice interfaceTypeChoice = vppEndpoint.getInterfaceTypeChoice();
+        Optional<ConfigCommand> potentialIfaceCommand = Optional.absent();
+        if (interfaceTypeChoice instanceof VhostUserCase) {
+            potentialIfaceCommand = createInterfaceWithoutBdCommand(vppEndpoint, Operations.PUT);
+        } else if (interfaceTypeChoice instanceof TapCase) {
+            potentialIfaceCommand = createTapInterfaceWithoutBdCommand(vppEndpoint, Operations.PUT);
+        }
+
         if (!potentialIfaceCommand.isPresent()) {
+            LOG.debug("Interface/PUT command was not created for VppEndpoint point {}", vppEndpoint);
             return Futures.immediateFuture(null);
         }
         ConfigCommand ifaceWithoutBdCommand = potentialIfaceCommand.get();
@@ -98,7 +108,7 @@ public class InterfaceManager implements AutoCloseable {
         Optional<DataBroker> potentialVppDataProvider = mountDataProvider.getDataBrokerForMountPoint(vppNodeIid);
         if (!potentialVppDataProvider.isPresent()) {
             LOG.debug("Cannot get data broker for mount point {}", vppNodeIid);
-            Futures.immediateFuture(null);
+            return Futures.immediateFuture(null);
         }
         DataBroker vppDataBroker = potentialVppDataProvider.get();
         return createIfaceOnVpp(ifaceWithoutBdCommand, vppDataBroker, vppEndpoint, vppNodeIid);
@@ -119,9 +129,17 @@ public class InterfaceManager implements AutoCloseable {
         }, netconfWorker);
     }
 
-    private ListenableFuture<Void> vppEndpointDeleted(VppEndpoint vppEndpoint) {
-        Optional<ConfigCommand> potentialIfaceCommand = createInterfaceWithoutBdCommand(vppEndpoint, Operations.DELETE);
+    private ListenableFuture<Void> vppEndpointDeleted(@Nonnull VppEndpoint vppEndpoint) {
+        InterfaceTypeChoice interfaceTypeChoice = vppEndpoint.getInterfaceTypeChoice();
+        Optional<ConfigCommand> potentialIfaceCommand = Optional.absent();
+        if (interfaceTypeChoice instanceof VhostUserCase) {
+            potentialIfaceCommand = createInterfaceWithoutBdCommand(vppEndpoint, Operations.DELETE);
+        } else if (interfaceTypeChoice instanceof TapCase) {
+            potentialIfaceCommand = createTapInterfaceWithoutBdCommand(vppEndpoint, Operations.DELETE);
+        }
+
         if (!potentialIfaceCommand.isPresent()) {
+            LOG.debug("Interface/DELETE command was not created for VppEndpoint point {}", vppEndpoint);
             return Futures.immediateFuture(null);
         }
         ConfigCommand ifaceWithoutBdCommand = potentialIfaceCommand.get();
@@ -166,7 +184,7 @@ public class InterfaceManager implements AutoCloseable {
                 break;
             case DELETED:
                 if (event.isBeforeConnected()) {
-                    // TODO we could do snapshot of VppEndpoints 
+                    // TODO we could do snapshot of VppEndpoints
                     // which can be used for reconciliation
                 }
                 break;
@@ -197,6 +215,32 @@ public class InterfaceManager implements AutoCloseable {
         return Optional.of(vhostUserCommand);
     }
 
+    private static Optional<ConfigCommand> createTapInterfaceWithoutBdCommand(@Nonnull VppEndpoint vppEp,
+            @Nonnull Operations operation) {
+        if (!hasNodeAndInterface(vppEp)) {
+            LOG.debug("Interface command is not created for {}", vppEp);
+            return Optional.absent();
+        }
+        TapPortCommand.TapPortCommandBuilder builder = TapPortCommand.builder();
+        InterfaceTypeChoice interfaceTypeChoice = vppEp.getInterfaceTypeChoice();
+        if (interfaceTypeChoice instanceof TapCase) {
+            TapCase tapIface = (TapCase) interfaceTypeChoice;
+            String name = tapIface.getName();
+            if (Strings.isNullOrEmpty(name)) {
+                LOG.debug("Tap interface command is not created because name is missing. {}", vppEp);
+                return Optional.absent();
+            }
+            builder.setTapName(name);
+            builder.setPhysAddress(tapIface.getPhysicalAddress());
+        }
+        TapPortCommand tapPortCommand = builder
+                .setOperation(operation)
+                .setDescription(vppEp.getDescription())
+                .setInterfaceName(vppEp.getVppInterfaceName())
+                .build();
+        return Optional.of(tapPortCommand);
+    }
+
     /**
      * Adds bridge domain to an interface if the interface exist.<br>
      * It rewrites bridge domain in case it already exist.<br>
@@ -205,7 +249,7 @@ public class InterfaceManager implements AutoCloseable {
      * If the interface does not exist or other problems occur {@link ListenableFuture} will fail
      * as {@link Futures#immediateFailedFuture(Throwable)} with {@link Exception}
      * containing message in {@link Exception#getMessage()}
-     * 
+     *
      * @param bridgeDomainName bridge domain
      * @param addrEpWithLoc {@link AddressEndpointWithLocation} containing
      *        {@link ExternalLocationCase} where
@@ -282,7 +326,6 @@ public class InterfaceManager implements AutoCloseable {
     }
 
     /**
-     * <p>
      * Removes bridge domain (if exist) from an interface (if exist).<br>
      * {@link VppEndpointLocationProvider#VPP_ENDPOINT_LOCATION_PROVIDER} will update endpoint
      * location.
@@ -290,7 +333,7 @@ public class InterfaceManager implements AutoCloseable {
      * If the interface does not exist or other problems occur {@link ListenableFuture} will fail
      * as {@link Futures#immediateFailedFuture(Throwable)} with {@link Exception}
      * containing message in {@link Exception#getMessage()}
-     * 
+     *
      * @param addrEpWithLoc {@link AddressEndpointWithLocation} containing
      *        {@link ExternalLocationCase} where
      *        {@link ExternalLocationCase#getExternalNodeMountPoint()} MUST NOT be {@code null}
diff --git a/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/TapPortCommandTest.java b/renderers/vpp/src/test/java/org/opendaylight/groupbasedpolicy/renderer/vpp/commands/TapPortCommandTest.java
new file mode 100644 (file)
index 0000000..1e4bdcd
--- /dev/null
@@ -0,0 +1,205 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.vpp.commands;\r
+\r
+import com.google.common.base.Optional;\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.VppRendererDataBrokerTest;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.General;\r
+import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;\r
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Tap;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentation;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceAugmentationBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.L2Builder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces._interface.TapBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBasedBuilder;\r
+\r
+import java.util.concurrent.ExecutionException;\r
+\r
+public class TapPortCommandTest extends VppRendererDataBrokerTest {\r
+\r
+    private final static String DESCRIPTION = "used for testing";\r
+    private final static String INTERFACE_NAME = "testInterface";\r
+    private final static String TAP_NAME = "testTap00:11:22:33:44:55";\r
+    private final static String BRIDGE_DOMAIN = "testBD";\r
+    private final static Long DEVICE_ID = 0L;\r
+    private final static PhysAddress MAC_ADDRESS = new PhysAddress("00:11:22:33:44:55");\r
+\r
+    private final static String UPD_DESCRIPTION = "updated description";\r
+    private final static PhysAddress UPD_MAC_ADDRESS = new PhysAddress("55:44:33:22:11:00");\r
+    private final static String UPD_TAP_NAME = "testTapUpd";\r
+    private final static Long UPD_DEVICE_ID = 1L;\r
+\r
+    private final static VppInterfaceAugmentationBuilder vppAugmentationBuilder = new VppInterfaceAugmentationBuilder()\r
+        .setTap(new TapBuilder().setMac(MAC_ADDRESS).setTapName(TAP_NAME).setDeviceInstance(DEVICE_ID).build());\r
+\r
+    private final static VppInterfaceAugmentationBuilder vppAugmentationBuilderWithBD =\r
+            new VppInterfaceAugmentationBuilder(vppAugmentationBuilder.build())\r
+                .setL2(new L2Builder().setInterconnection(new BridgeBasedBuilder().setBridgeDomain(BRIDGE_DOMAIN)\r
+                    .setBridgedVirtualInterface(false)\r
+                    .build()).build());\r
+\r
+    private final static InterfaceBuilder interfaceBuilder =\r
+            new InterfaceBuilder().setKey(new InterfaceKey(INTERFACE_NAME))\r
+                .setEnabled(true)\r
+                .setDescription(DESCRIPTION)\r
+                .setType(Tap.class)\r
+                .setName(INTERFACE_NAME)\r
+                .setLinkUpDownTrapEnable(Interface.LinkUpDownTrapEnable.Enabled);\r
+\r
+    private final static Interface BASIC_INTERFACE =\r
+            interfaceBuilder.addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilder.build()).build();\r
+    private final static Interface BASIC_INTERFACE_WITH_BD = interfaceBuilder\r
+        .addAugmentation(VppInterfaceAugmentation.class, vppAugmentationBuilderWithBD.build()).build();\r
+\r
+    private DataBroker dataBroker;\r
+\r
+    @Before\r
+    public void init() {\r
+        dataBroker = getDataBroker();\r
+    }\r
+\r
+    @Test\r
+    public void testAddTapPort() throws ExecutionException, InterruptedException {\r
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+        TapPortCommand addCommand = TapPortCommand.builder()\r
+            .setOperation(General.Operations.PUT)\r
+            .setInterfaceName(INTERFACE_NAME)\r
+            .setTapName(TAP_NAME)\r
+            .setDescription(DESCRIPTION)\r
+            .setDeviceInstance(DEVICE_ID)\r
+            .setPhysAddress(MAC_ADDRESS)\r
+            .setEnabled(true)\r
+            .build();\r
+\r
+        Optional<Interface> optional = executeCommand(rwTx, addCommand);\r
+\r
+        Assert.assertTrue(optional.isPresent());\r
+        Assert.assertEquals(BASIC_INTERFACE, optional.get());\r
+\r
+    }\r
+\r
+    @Test\r
+    public void testAddTapPort_WithBridgeDomain() throws ExecutionException, InterruptedException {\r
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+        TapPortCommand addCommand = TapPortCommand.builder()\r
+            .setOperation(General.Operations.PUT)\r
+            .setInterfaceName(INTERFACE_NAME)\r
+            .setTapName(TAP_NAME)\r
+            .setDescription(DESCRIPTION)\r
+            .setDeviceInstance(DEVICE_ID)\r
+            .setPhysAddress(MAC_ADDRESS)\r
+            .setBridgeDomain(BRIDGE_DOMAIN)\r
+            .setEnabled(true)\r
+            .build();\r
+\r
+        Optional<Interface> optional = executeCommand(rwTx, addCommand);\r
+\r
+        Assert.assertTrue(optional.isPresent());\r
+        Assert.assertEquals(BASIC_INTERFACE_WITH_BD, optional.get());\r
+\r
+    }\r
+\r
+    private Optional<Interface> executeCommand(ReadWriteTransaction rwTx, TapPortCommand addCommand)\r
+            throws ExecutionException, InterruptedException {\r
+        addCommand.execute(rwTx);\r
+\r
+        rwTx.submit().get();\r
+\r
+        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+\r
+        return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                VppIidFactory.getInterfaceIID(new InterfaceKey(INTERFACE_NAME)), rTx);\r
+    }\r
+\r
+    @Test\r
+    public void testDeleteTapPort() throws ExecutionException, InterruptedException {\r
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+\r
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),\r
+                BASIC_INTERFACE, true);\r
+        rwTx.submit().get();\r
+\r
+        Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());\r
+\r
+        Assert.assertTrue(optional.isPresent());\r
+\r
+        TapPortCommand deleteCommand = TapPortCommand.builder()\r
+            .setOperation(General.Operations.DELETE)\r
+            .setInterfaceName(INTERFACE_NAME)\r
+            .setTapName(TAP_NAME)\r
+            .build();\r
+\r
+        ReadWriteTransaction rwTxDel = dataBroker.newReadWriteTransaction();\r
+        deleteCommand.execute(rwTxDel);\r
+        rwTxDel.submit();\r
+\r
+        Optional<Interface> optionalDeleted = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                VppIidFactory.getInterfaceIID(new InterfaceKey(deleteCommand.getName())),\r
+                dataBroker.newReadOnlyTransaction());\r
+\r
+        Assert.assertFalse(optionalDeleted.isPresent());\r
+    }\r
+\r
+    @Test\r
+    public void testUpdateTapPort() throws ExecutionException, InterruptedException {\r
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+\r
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()),\r
+                BASIC_INTERFACE, true);\r
+        rwTx.submit().get();\r
+\r
+        Optional<Interface> optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                VppIidFactory.getInterfaceIID(BASIC_INTERFACE.getKey()), dataBroker.newReadOnlyTransaction());\r
+\r
+        Assert.assertTrue(optional.isPresent());\r
+\r
+        TapPortCommand updateCommand = TapPortCommand.builder()\r
+            .setOperation(General.Operations.MERGE)\r
+            .setInterfaceName(INTERFACE_NAME)\r
+            .setTapName(UPD_TAP_NAME)\r
+            .setDescription(UPD_DESCRIPTION)\r
+            .setPhysAddress(UPD_MAC_ADDRESS)\r
+            .setDeviceInstance(UPD_DEVICE_ID)\r
+            .setEnabled(false)\r
+            .build();\r
+\r
+        ReadWriteTransaction rwTxUpd = dataBroker.newReadWriteTransaction();\r
+        updateCommand.execute(rwTxUpd);\r
+        rwTxUpd.submit().get();\r
+\r
+        Optional<Interface> optionalUpdated = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                VppIidFactory.getInterfaceIID(new InterfaceKey(updateCommand.getName())),\r
+                dataBroker.newReadOnlyTransaction());\r
+\r
+        Assert.assertTrue(optionalUpdated.isPresent());\r
+        Interface updatedInterface = optionalUpdated.get();\r
+\r
+        Assert.assertEquals(UPD_DESCRIPTION, updatedInterface.getDescription());\r
+        Assert.assertFalse(updatedInterface.isEnabled());\r
+        VppInterfaceAugmentation augmentation = updatedInterface.getAugmentation(VppInterfaceAugmentation.class);\r
+        Assert.assertEquals(INTERFACE_NAME, updatedInterface.getName());\r
+        Assert.assertEquals(UPD_DEVICE_ID, augmentation.getTap().getDeviceInstance());\r
+        Assert.assertEquals(UPD_MAC_ADDRESS, augmentation.getTap().getMac());\r
+        Assert.assertEquals(UPD_TAP_NAME, augmentation.getTap().getTapName());\r
+\r
+    }\r
+}\r