[ONOS-7731] Update api interface & implementation of openstack vtap app

Change-Id: I7c3c7888b00a7357b13e3b1756e9cd0a1bb6a5c0
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtap.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtap.java
index 6f74e81..ad189e2 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtap.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtap.java
@@ -22,15 +22,14 @@
 import java.util.Set;
 
 /**
- * Abstraction of an OpenstackVtap.
+ * Abstraction of an openstack vtap.
  */
 public interface OpenstackVtap extends Annotated {
 
     /**
-     * Openstack vTap type.
+     * List of openstack vtap types.
      */
     enum Type {
-
         /**
          * Indicates mirroring both TX and RX traffic.
          */
@@ -47,9 +46,9 @@
         VTAP_TX(0x1),
 
         /**
-         * Indicates do not mirroring any traffic.
+         * Indicates selection of mirroring any traffic.
          */
-        VTAP_NONE(0);
+        VTAP_ANY(0x0);
 
         private final int type;
 
@@ -63,97 +62,96 @@
     }
 
     /**
-     * OpenstackVtap identifier.
+     * Returns the openstack vtap identifier.
      *
-     * @return OpenstackVtap id
+     * @return vtap ID
      */
     OpenstackVtapId id();
 
     /**
-     * Returns OpenstackVtap type.
+     * Returns the openstack vtap type.
      *
-     * @return type
+     * @return type of vtap
      */
     Type type();
 
     /**
-     * Returns the vTap criterion.
+     * Returns the openstack vtap criterion.
      *
-     * @return vTap criterion
+     * @return criterion of vtap
      */
-    OpenstackVtapCriterion vTapCriterion();
+    OpenstackVtapCriterion vtapCriterion();
 
     /**
-     * Returns a collection of TX device identifiers.
+     * Returns a collection of device identifiers for tx.
      *
-     * @return device identifiers
+     * @return device identifiers for tx
      */
     Set<DeviceId> txDeviceIds();
 
     /**
-     * Returns a collection of RX device identifiers.
+     * Returns a collection of device identifiers for rx.
      *
-     * @return device identifiers
+     * @return device identifiers for rx
      */
     Set<DeviceId> rxDeviceIds();
 
     /**
-     * Builder of new openstack vTap instance.
+     * Builder of new openstack vtap instance.
      */
     interface Builder {
-
         /**
-         * Returns openstack vTap builder with supplied vTap identifier.
+         * Returns openstack vtap builder with supplied id.
          *
-         * @param id vTap identifier
-         * @return openstack vTap builder
+         * @param id openstack vtap id
+         * @return openstack vtap builder
          */
         Builder id(OpenstackVtapId id);
 
         /**
-         * Returns openstack vTap builder with supplied vTap type.
+         * Returns openstack vtap builder with supplied type.
          *
-         * @param type vTap type
-         * @return openstack vTap builder
+         * @param type of the vtap
+         * @return openstack vtap builder
          */
         Builder type(OpenstackVtap.Type type);
 
         /**
-         * Returns openstack vTap builder with supplied vTap criterion.
+         * Returns openstack vtap builder with supplied criterion.
          *
-         * @param vTapCriterion vTap criterion
-         * @return openstack vTap builder
+         * @param vtapCriterion for the vtap
+         * @return openstack vtap builder
          */
-        Builder vTapCriterion(OpenstackVtapCriterion vTapCriterion);
+        Builder vtapCriterion(OpenstackVtapCriterion vtapCriterion);
 
         /**
-         * Returns openstack vTap builder with supplied TX device identifiers.
+         * Returns openstack vtap builder with supplied tx deviceId set.
          *
-         * @param txDeviceIds TX device identifiers
-         * @return openstack vTap builder
+         * @param txDeviceIds deviceId set for tx
+         * @return openstack vtap builder
          */
         Builder txDeviceIds(Set<DeviceId> txDeviceIds);
 
         /**
-         * Returns openstack vTap builder with supplied RX device identifiers.
+         * Returns openstack vtap builder with supplied rx deviceId set.
          *
-         * @param rxDeviceIds RX device identifiers
-         * @return openstack vTap builder
+         * @param rxDeviceIds deviceId set for rx
+         * @return openstack vtap builder
          */
         Builder rxDeviceIds(Set<DeviceId> rxDeviceIds);
 
         /**
-         * Returns openstack vTap builder with supplied annotations.
+         * Returns openstack vtap builder with supplied annotations.
          *
          * @param annotations a set of annotations
-         * @return openstack vTap builder
+         * @return openstack vtap builder
          */
-        Builder annotations(SparseAnnotations... annotations);
+        Builder annotations(SparseAnnotations annotations);
 
         /**
-         * Builds an immutable openstack vTap instance.
+         * Builds an immutable OpenstackVtap instance.
          *
-         * @return openstack vTap instance
+         * @return openstack vtap instance
          */
         OpenstackVtap build();
     }
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapAdminService.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapAdminService.java
index da9fd24..1828bee 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapAdminService.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapAdminService.java
@@ -15,60 +15,24 @@
  */
 package org.onosproject.openstackvtap.api;
 
-import org.onlab.packet.VlanId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-
 /**
- * Service for administering the inventory of vTap.
+ * Service for administering the inventory of openstack vtap.
  */
 public interface OpenstackVtapAdminService extends OpenstackVtapService {
 
     /**
-     * Creates a new vTap based on the specified description.
-     *
-     * @param type                  vTap type
-     * @param vTapCriterion         criterion of a vTap
-     * @return created vTap object or null if error occurred
+     * Initializes the flow rules and group tables, tunneling interface for all completed compute nodes.
      */
-    OpenstackVtap createVtap(OpenstackVtap.Type type, OpenstackVtapCriterion vTapCriterion);
+    void initVtap();
 
     /**
-     * Updates the existing vTap based on the given vTap instance.
-     *
-     * @param vTapId             vTap identifier
-     * @param vTap               vTap instance to be modified
-     * @return updated vTap object or null if error occurred
+     * Clears the flow rules and group tables, tunneling interfaces for all compute nodes.
      */
-    OpenstackVtap updateVtap(OpenstackVtapId vTapId, OpenstackVtap vTap);
+    void clearVtap();
 
     /**
-     * Removes the specified vTap with given vTap identifier.
-     *
-     * @param vTapId             vTap identifier
-     * @return removed vTap object or null if error occurred
+     * Purges all flow rules and group tables, tunneling interface for openstack vtap.
      */
-    OpenstackVtap removeVtap(OpenstackVtapId vTapId);
+    void purgeVtap();
 
-    /**
-     * Sets output port and VLAN tag for vTap.
-     *
-     * @param deviceId           device identifier
-     * @param type               vTap type
-     * @param portNumber         port number
-     * @param vlanId             VLAN tag
-     */
-    void setVtapOutput(DeviceId deviceId, OpenstackVtap.Type type,
-                       PortNumber portNumber, VlanId vlanId);
-
-    /**
-     * Sets output port and VNI for vTap.
-     *
-     * @param deviceId          device identifier
-     * @param type              vTap type
-     * @param portNumber        port number
-     * @param vni               virtual network index (VNI) of VxLAN
-     */
-    void setVtapOutput(DeviceId deviceId, OpenstackVtap.Type type,
-                       PortNumber portNumber, int vni);
 }
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapCriterion.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapCriterion.java
index eb21b0c..088f12d 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapCriterion.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapCriterion.java
@@ -19,35 +19,35 @@
 import org.onlab.packet.TpPort;
 
 /**
- * A vTAP criterion used for mirroring traffic.
+ * A vtap criterion used for mirroring traffic.
  */
 public interface OpenstackVtapCriterion {
 
     /**
-     * Returns IP Prefix of Source VM.
+     * Returns IP prefix of source.
      *
-     * @return source IP prefix
+     * @return source IP prefix of vtap criterion
      */
     IpPrefix srcIpPrefix();
 
     /**
-     * Returns IP Prefix of Destination VM.
+     * Returns IP prefix of destination.
      *
-     * @return destination IP prefix
+     * @return destination IP prefix of vtap criterion
      */
     IpPrefix dstIpPrefix();
 
     /**
      * Returns IP protocol.
      *
-     * @return IP protocol
+     * @return IP protocol of vtap criterion
      */
     byte ipProtocol();
 
     /**
      * Returns source transport port.
      *
-     * @return source transport port number
+     * @return source transport port of vtap criterion
      */
 
     TpPort srcTpPort();
@@ -55,60 +55,59 @@
     /**
      * Returns destination transport port.
      *
-     * @return destination transport port number
+     * @return destination transport port of vtap criterion
      */
     TpPort dstTpPort();
 
     /**
-     * Builder of new openstack vTap criteria.
+     * Builder of new OpenstackVtapCriterion instance.
      */
     interface Builder {
-
         /**
-         * Builds an immutable openstack vTap criterion instance.
+         * Returns openstack vtap criterion builder with supplied source IP prefix.
          *
-         * @return openstack vTap criterion
-         */
-        OpenstackVtapCriterion build();
-
-        /**
-         * Returns openstack vTap criterion builder with supplied srcIpPrefix.
-         *
-         * @param srcIpPrefix Source IP address
-         * @return openstack vTap criterion builder
+         * @param srcIpPrefix Source IP prefix
+         * @return openstack vtap criterion builder
          */
         Builder srcIpPrefix(IpPrefix srcIpPrefix);
 
         /**
-         * Returns openstack vTap criterion builder with supplied srcIpPrefix.
+         * Returns openstack vtap criterion builder with supplied destination IP prefix.
          *
-         * @param dstIpPrefix Destination IP Prefix
-         * @return openstack vTap criterion builder
+         * @param dstIpPrefix Destination IP prefix
+         * @return openstack vtap criterion builder
          */
         Builder dstIpPrefix(IpPrefix dstIpPrefix);
 
         /**
-         * Returns openstack vTap criterion builder with supplied ipProtocol.
+         * Returns openstack vtap criterion builder with supplied ipProtocol.
          *
-         * @param ipProtocol IP protocol number
-         * @return openstack vTap criterion builder
+         * @param ipProtocol IP protocol
+         * @return openstack vtap criterion builder
          */
         Builder ipProtocol(byte ipProtocol);
 
         /**
-         * Returns openstack vTap criterion builder with supplied srcTpPort.
+         * Returns openstack vtap criterion builder with supplied source port.
          *
-         * @param srcTpPort Source transport port number
-         * @return openstack vTap criterion builder
+         * @param srcTpPort Source transport port
+         * @return openstack vtap criterion builder
          */
         Builder srcTpPort(TpPort srcTpPort);
 
         /**
-         * Returns openstack vTap criterion builder with supplied dstTpPort.
+         * Returns openstack vtap criterion builder with supplied destination port.
          *
-         * @param dstTpPort Destination transport port number
-         * @return openstack vTap criterion builder
+         * @param dstTpPort Destination transport port
+         * @return openstack vtap criterion builder
          */
         Builder dstTpPort(TpPort dstTpPort);
+
+        /**
+         * Builds an immutable OpenstackVtapCriterion instance.
+         *
+         * @return OpenstackVtapCriterion criterion
+         */
+        OpenstackVtapCriterion build();
     }
 }
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapEvent.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapEvent.java
index 70c1e11..d44c9f9 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapEvent.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapEvent.java
@@ -19,81 +19,166 @@
 import org.onosproject.event.AbstractEvent;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static com.google.common.base.Preconditions.checkState;
 
 /**
- * Describes vTap event.
+ * Describes openstack vtap event.
  */
-public class OpenstackVtapEvent extends AbstractEvent<OpenstackVtapEvent.Type, OpenstackVtap> {
+public class OpenstackVtapEvent extends AbstractEvent<OpenstackVtapEvent.Type, Object> {
+
+    private static final String INVALID_OBJ_TYPE = "Invalid OpenstackVtapEvent object type of %";
 
     /**
-     * Type of vTap events.
+     * Type of openstack vtap events.
      */
     public enum Type {
 
         /**
-         * Signifies that a new vTap has been added.
+         * Signifies that a new openstack vtap network has been added.
+         */
+        VTAP_NETWORK_ADDED,
+
+        /**
+         * Signifies that a openstack vtap network has been changed.
+         */
+        VTAP_NETWORK_UPDATED,
+
+        /**
+         * Signifies that a openstack vtap network has been removed.
+         */
+        VTAP_NETWORK_REMOVED,
+
+        /**
+         * Signifies that a new openstack vtap has been added.
          */
         VTAP_ADDED,
 
         /**
-         * Signifies that a vTap has been removed.
-         */
-        VTAP_REMOVED,
-
-        /**
-         * Signifies that a vTap data changed.
+         * Signifies that a openstack vtap has been changed.
          */
         VTAP_UPDATED,
+
+        /**
+         * Signifies that a openstack vtap has been removed.
+         */
+        VTAP_REMOVED,
     }
 
-    private OpenstackVtap prevSubject;
+    private final Object prevSubject;
 
     /**
-     * Creates an event of a given type and for the specified vTap and the
-     * current time.
+     * Creates an event with previous openstack vtap network subject.
      *
-     * @param type vTap event type
-     * @param vTap event vTap subject
+     * The openstack vtap network subject is null if the type is removed
+     * The previous openstack vtap network subject is null if the type is added
+     *
+     * @param type            openstack vtap event type
+     * @param vtapNetwork     event openstack vtap network subject
+     * @param prevVtapNetwork previous openstack vtap network subject
      */
-    public OpenstackVtapEvent(Type type, OpenstackVtap vTap) {
-        super(type, vTap);
+    public OpenstackVtapEvent(Type type,
+                              OpenstackVtapNetwork vtapNetwork,
+                              OpenstackVtapNetwork prevVtapNetwork) {
+        super(type, vtapNetwork);
+        prevSubject = prevVtapNetwork;
     }
 
     /**
-     * Creates an event of a given type and for the specified vTap and time.
+     * Creates an event of a given type and for the specified openstack vtap network and time.
      *
-     * @param type vTap event type
-     * @param vTap event vTap subject
-     * @param time occurrence time
+     * @param type            openstack vtap event type
+     * @param vtapNetwork     event openstack vtap network subject
+     * @param prevVtapNetwork previous openstack vtap network subject
+     * @param time            occurrence time
      */
-    public OpenstackVtapEvent(Type type, OpenstackVtap vTap, long time) {
-        super(type, vTap, time);
+    public OpenstackVtapEvent(Type type,
+                              OpenstackVtapNetwork vtapNetwork,
+                              OpenstackVtapNetwork prevVtapNetwork,
+                              long time) {
+        super(type, vtapNetwork, time);
+        prevSubject = prevVtapNetwork;
     }
 
     /**
-     * Creates an event with previous subject.
+     * Creates an event with previous openstack vtap subject.
      *
-     * The previous subject is ignored if the type is not moved or updated
+     * The openstack vtap subject is null if the type is removed
+     * The previous openstack vtap subject is null if the type is added
      *
-     * @param type vTap event type
-     * @param vTap event vTap subject
-     * @param prevSubject previous vTap subject
+     * @param type     openstack vtap event type
+     * @param vtap     event openstack vtap subject
+     * @param prevVtap previous openstack vtap subject
      */
-    public OpenstackVtapEvent(Type type, OpenstackVtap vTap, OpenstackVtap prevSubject) {
-        super(type, vTap);
-        if (type == Type.VTAP_UPDATED) {
-            this.prevSubject = prevSubject;
-        }
+    public OpenstackVtapEvent(Type type, OpenstackVtap vtap, OpenstackVtap prevVtap) {
+        super(type, vtap);
+        prevSubject = prevVtap;
     }
 
     /**
-     * Gets the previous subject in this vTap event.
+     * Creates an event of a given type and for the specified openstack vtap and time.
+     *
+     * @param type     openstack vtap event type
+     * @param vtap     event openstack vtap subject
+     * @param prevVtap previous openstack vtap subject
+     * @param time     occurrence time
+     */
+    public OpenstackVtapEvent(Type type, OpenstackVtap vtap, OpenstackVtap prevVtap, long time) {
+        super(type, vtap, time);
+        prevSubject = prevVtap;
+    }
+
+    /**
+     * Gets the previous subject in this openstack vtap event.
      *
      * @return the previous subject, or null if previous subject is not
      *         specified.
      */
-    public OpenstackVtap prevSubject() {
-        return this.prevSubject;
+    public Object prevSubject() {
+        return prevSubject;
+    }
+
+    /**
+     * Gets the openstack vtap network in this openstack vtap event.
+     *
+     * @return the subject, or null if the type is removed
+     */
+    public OpenstackVtapNetwork openstackVtapNetwork() {
+        Object obj = subject();
+        checkState(obj == null || obj instanceof OpenstackVtapNetwork, INVALID_OBJ_TYPE, obj);
+        return (OpenstackVtapNetwork) obj;
+    }
+
+    /**
+     * Gets the previous openstack vtap network in this openstack vtap event.
+     *
+     * @return the previous subject, or null if type is added
+     */
+    public OpenstackVtapNetwork prevOpenstackVtapNetwork() {
+        Object obj = prevSubject;
+        checkState(obj == null || obj instanceof OpenstackVtapNetwork, INVALID_OBJ_TYPE, obj);
+        return (OpenstackVtapNetwork) obj;
+    }
+
+    /**
+     * Gets the openstack vtap in this openstack vtap event.
+     *
+     * @return the subject, or null if the type is removed
+     */
+    public OpenstackVtap openstackVtap() {
+        Object obj = subject();
+        checkState(obj == null || obj instanceof OpenstackVtap, INVALID_OBJ_TYPE, obj);
+        return (OpenstackVtap) obj;
+    }
+
+    /**
+     * Gets the previous openstack vtap in this openstack vtap event.
+     *
+     * @return the previous subject, or null if type is added
+     */
+    public OpenstackVtap prevOpenstackVtap() {
+        Object obj = prevSubject;
+        checkState(obj == null || obj instanceof OpenstackVtap, INVALID_OBJ_TYPE, obj);
+        return (OpenstackVtap) obj;
     }
 
     @Override
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapId.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapId.java
index ce8945d..c70fb03 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapId.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapId.java
@@ -19,12 +19,12 @@
 import java.util.UUID;
 
 /**
- * Immutable representation of an openstack vTap identifier.
+ * Immutable representation of an openstack vtap identifier.
  */
 public final class OpenstackVtapId {
 
     /**
-     * Represents either no vTap, or an unspecified vTap.
+     * Represents either no vtap, or an unspecified vtap.
      */
     public static final OpenstackVtapId NONE = new OpenstackVtapId(null);
 
@@ -50,35 +50,35 @@
     }
 
     /**
-     * Creates a vTap identifier using the supplied UUID.
+     * Creates a vtap identifier using the supplied UUID.
      *
-     * @param uuid vTap UUID
-     * @return vTap identifier
+     * @param uuid vtap UUID
+     * @return vtap identifier
      */
-    public static OpenstackVtapId vTapId(UUID uuid) {
+    public static OpenstackVtapId vtapId(UUID uuid) {
         return new OpenstackVtapId(uuid);
     }
 
     /**
-     * Creates a vTap identifier using the supplied string format of UUID.
+     * Creates a vtap identifier using the supplied string format of UUID.
      *
-     * @param uuidString vTap UUID
-     * @return vTap identifier
+     * @param uuidString vtap UUID
+     * @return vtap identifier
      */
-    public static OpenstackVtapId vTapId(String uuidString) {
+    public static OpenstackVtapId vtapId(String uuidString) {
         try {
-            return vTapId(UUID.fromString(uuidString));
+            return vtapId(UUID.fromString(uuidString));
         } catch (Exception e) {
             throw new IllegalArgumentException("Invalid UUID string: " + uuidString);
         }
     }
 
     /**
-     * Creates a OpenstackVtap id using random uuid.
+     * Creates a openstack vtap id using random uuid.
      *
-     * @return OpenstackVtap identifier
+     * @return openstack vtap identifier
      */
-    public static OpenstackVtapId vTapId() {
+    public static OpenstackVtapId vtapId() {
         return new OpenstackVtapId(UUID.randomUUID());
     }
 
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapListener.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapListener.java
index ebea5ed..9df7384 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapListener.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapListener.java
@@ -18,7 +18,7 @@
 import org.onosproject.event.EventListener;
 
 /**
- * Entity capable of receiving user related events.
+ * Entity capable of receiving openstack vtap related events.
  */
 public interface OpenstackVtapListener extends EventListener<OpenstackVtapEvent> {
 }
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapNetwork.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapNetwork.java
new file mode 100644
index 0000000..daa95a8
--- /dev/null
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapNetwork.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * 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 org.onosproject.openstackvtap.api;
+
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.Annotated;
+import org.onosproject.net.SparseAnnotations;
+
+/**
+ * Abstraction of an openstack vtap network.
+ */
+public interface OpenstackVtapNetwork extends Annotated {
+
+    /**
+     * List of valid openstack vtap tunneling modes.
+     */
+    enum Mode {
+        /**
+         * Indicates GRE tunneling.
+         */
+        GRE,
+
+        /**
+         * Indicates VXLAN tunneling.
+         */
+        VXLAN
+    }
+
+    /**
+     * Returns the OpenstackVtapNetwork mode.
+     *
+     * @return mode of vtap tunneling
+     */
+    Mode mode();
+
+    /**
+     * Returns the network id of the vtap tunneling.
+     *
+     * @return networkId (e.g., gre key, vxlan vni)
+     */
+    Integer networkId();
+
+    /**
+     * Returns the vtap server IP address used for tunneling.
+     *
+     * @return ip address for vtap server
+     */
+    IpAddress serverIp();
+
+    /**
+     * Builder of new OpenstackVtapNetwork instance.
+     */
+    interface Builder {
+        /**
+         * Returns openstack vtap network builder with supplied OpenstackVtapNetwork mode.
+         *
+         * @param mode mode of vtap tunneling
+         * @return openstack vtap network builder
+         */
+        Builder mode(Mode mode);
+
+        /**
+         * Returns openstack vtap network builder with supplied networkId for tunneling.
+         *
+         * @param networkId (e.g., gre key, vxlan vni)
+         * @return openstack vtap network builder
+         */
+        Builder networkId(Integer networkId);
+
+        /**
+         * Returns openstack vtap network builder with supplied server IP address.
+         *
+         * @param serverIp ip address for vtap server
+         * @return openstack vtap network builder
+         */
+        Builder serverIp(IpAddress serverIp);
+
+        /**
+         * Returns openstack vtap network builder with supplied annotations.
+         *
+         * @param annotations a set of annotations
+         * @return openstack vtap network builder
+         */
+        Builder annotations(SparseAnnotations annotations);
+
+        /**
+         * Builds an immutable OpenstackVtapNetwork instance.
+         *
+         * @return OpenstackVtapNetwork instance
+         */
+        OpenstackVtapNetwork build();
+    }
+}
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapService.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapService.java
index 5041aaf..bfb63a0 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapService.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapService.java
@@ -15,47 +15,111 @@
  */
 package org.onosproject.openstackvtap.api;
 
+import org.onlab.packet.IpAddress;
 import org.onosproject.event.ListenerService;
 import org.onosproject.net.DeviceId;
 
 import java.util.Set;
 
 /**
- * Service for interacting with the inventory of vTap.
+ * Service for interacting with the inventory of openstack vtap.
  */
 public interface OpenstackVtapService
         extends ListenerService<OpenstackVtapEvent, OpenstackVtapListener> {
 
     /**
-     * Returns the number of vTaps in the store.
+     * Creates a new openstack vtap network based on the specified description.
      *
-     * @param type               vTap type
-     * @return vTap count
+     * @param mode      mode of vtap network
+     * @param networkId network id of the vtap tunneling network
+     * @param serverIp  server IP address used for tunneling
+     * @return created openstack vtap network object or null if error occurred
+     */
+    OpenstackVtapNetwork createVtapNetwork(OpenstackVtapNetwork.Mode mode, Integer networkId, IpAddress serverIp);
+
+    /**
+     * Updates the openstack vtap network based on the specified description.
+     *
+     * @param description description of vtap network
+     * @return updated openstack vtap network object or null if error occurred
+     */
+    OpenstackVtapNetwork updateVtapNetwork(OpenstackVtapNetwork description);
+
+    /**
+     * Removes the specified openstack vtap network.
+     *
+     * @return removed openstack vtap network object or null if error occurred
+     */
+    OpenstackVtapNetwork removeVtapNetwork();
+
+    /**
+     * Returns the openstack vtap network.
+     *
+     * @return openstack vtap network or null if not exists
+     */
+    OpenstackVtapNetwork getVtapNetwork();
+
+    /**
+     * Returns a set of devices which are associated with the openstack vtap network.
+     *
+     * @return set of devices
+     */
+    Set<DeviceId> getVtapNetworkDevices();
+
+    /**
+     * Creates a new openstack vtap based on the specified type and criterion.
+     *
+     * @param type          type of vtap (all,rx,tx)
+     * @param vtapCriterion criterion of vtap
+     * @return created openstack vtap object or null if error occurred
+     */
+    OpenstackVtap createVtap(OpenstackVtap.Type type, OpenstackVtapCriterion vtapCriterion);
+
+    /**
+     * Updates the openstack vtap with specified description.
+     *
+     * @param description description of vtap
+     * @return updated openstack vtap object or null if error occurred
+     */
+    OpenstackVtap updateVtap(OpenstackVtap description);
+
+    /**
+     * Removes the specified openstack vtap with given vtap identifier.
+     *
+     * @param vtapId vtap identifier
+     * @return removed openstack vtap object or null if error occurred
+     */
+    OpenstackVtap removeVtap(OpenstackVtapId vtapId);
+
+    /**
+     * Returns the number of openstack vtaps for the given type.
+     *
+     * @param type type of vtap (any,rx,tx,all)
+     * @return number of openstack vtaps
      */
     int getVtapCount(OpenstackVtap.Type type);
 
     /**
-     * Returns a collection of selected vTaps in the store.
+     * Returns a set of openstack vtaps for the given type.
      *
-     * @param type               vTap type
-     * @return iterable collection of selected vTaps
+     * @param type type of vtap (any,rx,tx,all)
+     * @return set of openstack vtaps
      */
     Set<OpenstackVtap> getVtaps(OpenstackVtap.Type type);
 
     /**
-     * Returns the vTap with the specified identifier.
+     * Returns the openstack vtap with the specified identifier.
      *
-     * @param vTapId             vTap identifier
-     * @return vTap or null if not exist
+     * @param vtapId vtap identifier
+     * @return openstack vtap or null if one with the given identifier is not known
      */
-    OpenstackVtap getVtap(OpenstackVtapId vTapId);
+    OpenstackVtap getVtap(OpenstackVtapId vtapId);
 
     /**
-     * Returns a collection of vTaps which are associated with the given device.
+     * Returns a set of openstack vtaps which are associated with the given device.
      *
-     * @param type               vTap type
-     * @param deviceId           device identifier
-     * @return a set of vTaps
+     * @param deviceId device identifier
+     * @return set of openstack vtaps
      */
-    Set<OpenstackVtap> getVtapsByDeviceId(OpenstackVtap.Type type, DeviceId deviceId);
+    Set<OpenstackVtap> getVtapsByDeviceId(DeviceId deviceId);
 }
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapStore.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapStore.java
index 15c945e..da9364d 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapStore.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/OpenstackVtapStore.java
@@ -21,92 +21,162 @@
 import java.util.Set;
 
 /**
- * Manages inventory of OpenstackVtap states; not intended for direct use.
+ * Manages inventory of openstack vtap datum; not intended for direct use.
  */
 public interface OpenstackVtapStore
         extends Store<OpenstackVtapEvent, OpenstackVtapStoreDelegate> {
 
     /**
-     * Creates a new vTap or updates the existing one based on the specified
-     * description.
+     * Creates a new openstack vtap network based on the specified description.
      *
-     * @param vTapId             vTap identifier
-     * @param description        vTap description data
-     * @param replaceFlag        replace device set if true, merge device set otherwise
-     * @return created or updated vTap object or null if error occurred
+     * @param key         vtap network identifier
+     * @param description description of vtap network
+     * @return created openstack vtap network object or null if error occurred
      */
-    OpenstackVtap createOrUpdateVtap(OpenstackVtapId vTapId, OpenstackVtap description, boolean replaceFlag);
+    OpenstackVtapNetwork createVtapNetwork(Integer key, OpenstackVtapNetwork description);
 
     /**
-     * Removes the specified vTap from the inventory by the given vTap identifier.
+     * Updates the openstack vtap network based on the specified description.
      *
-     * @param vTapId             vTap identifier
-     * @return removed vTap object or null if error occurred
+     * @param key         vtap network identifier
+     * @param description description of vtap network
+     * @return updated openstack vtap network object or null if error occurred
      */
-    OpenstackVtap removeVtapById(OpenstackVtapId vTapId);
+    OpenstackVtapNetwork updateVtapNetwork(Integer key, OpenstackVtapNetwork description);
 
     /**
-     * Adds the specified device id from the vTap entry.
+     * Removes the specified openstack vtap network with the specified identifier.
      *
-     * @param vTapId             vTap identification
-     * @param type               vTap type
-     * @param deviceId           device identifier to be added
+     * @param key vtap network identifier
+     * @return removed openstack vtap network object or null if error occurred
+     */
+    OpenstackVtapNetwork removeVtapNetwork(Integer key);
+
+    /**
+     * Removes all openstack vtap networks.
+     */
+    void clearVtapNetworks();
+
+    /**
+     * Returns the number of openstack vtap networks.
+     *
+     * @return number of openstack vtap networks
+     */
+    int getVtapNetworkCount();
+
+    /**
+     * Returns the openstack vtap network with the specified identifier.
+     *
+     * @param key vtap network identifier
+     * @return openstack vtap or null if one with the given identifier is not known
+     */
+    OpenstackVtapNetwork getVtapNetwork(Integer key);
+
+    /**
+     * Adds the specified device id to the specified vtap network entry.
+     *
+     * @param key      vtap network identifier
+     * @param deviceId device identifier to be added
      * @return true on success, false otherwise
      */
-    boolean addDeviceToVtap(OpenstackVtapId vTapId, OpenstackVtap.Type type, DeviceId deviceId);
+    boolean addDeviceToVtapNetwork(Integer key, DeviceId deviceId);
 
     /**
-     * Removes the specified device id from the vTap entry.
+     * Removes the specified device id from the specified vtap network entry.
      *
-     * @param vTapId             vTap identification
-     * @param type               vTap type
-     * @param deviceId           device identifier to be removed
+     * @param key      vtap network identifier
+     * @param deviceId device identifier to be removed
      * @return true on success, false otherwise
      */
-    boolean removeDeviceFromVtap(OpenstackVtapId vTapId, OpenstackVtap.Type type, DeviceId deviceId);
+    boolean removeDeviceFromVtapNetwork(Integer key, DeviceId deviceId);
 
     /**
-     * Adds the specified device id from the vTap entry.
+     * Returns a set of device identifiers from the specified vtap network entry.
      *
-     * @param vTapId             vTap identification
-     * @param txDeviceIds        TX device identifiers to be updated
-     * @param rxDeviceIds        RX device identifiers to be updated
-     * @param replaceFlag        replace device set if true, merge device set otherwise
-     * @return true on success, false otherwise
+     * @param key vtap network identifier
+     * @return set of device identifier
      */
-    boolean updateDeviceForVtap(OpenstackVtapId vTapId, Set<DeviceId> txDeviceIds,
-                                Set<DeviceId> rxDeviceIds, boolean replaceFlag);
+    Set<DeviceId> getVtapNetworkDevices(Integer key);
 
     /**
-     * Returns the number of vTaps in the store.
+     * Creates a new openstack vtap based on the specified description.
      *
-     * @param type               vTap type
-     * @return vTap count
+     * @param description description of vtap
+     * @return created openstack vtap object or null if error occurred
+     */
+    OpenstackVtap createVtap(OpenstackVtap description);
+
+    /**
+     * Updates the openstack vtap with specified description.
+     *
+     * @param description    description of vtap
+     * @param replaceDevices replace device set if true, merge device set otherwise
+     * @return updated openstack vtap object or null if error occurred
+     */
+    OpenstackVtap updateVtap(OpenstackVtap description, boolean replaceDevices);
+
+    /**
+     * Removes the specified openstack vtap with given vtap identifier.
+     *
+     * @param vtapId vtap identifier
+     * @return removed openstack vtap object or null if error occurred
+     */
+    OpenstackVtap removeVtap(OpenstackVtapId vtapId);
+
+    /**
+     * Removes all openstack vtaps.
+     */
+    void clearVtaps();
+
+    /**
+     * Returns the number of openstack vtaps for the given type.
+     *
+     * @param type type of vtap (any,rx,tx,all)
+     * @return number of openstack vtaps
      */
     int getVtapCount(OpenstackVtap.Type type);
 
     /**
-     * Returns a collection of selected vTaps in the store.
+     * Returns a set of openstack vtaps for the given type.
      *
-     * @param type               vTap type
-     * @return iterable collection of selected vTaps
+     * @param type type of vtap (any,rx,tx,all)
+     * @return set of openstack vtaps
      */
     Set<OpenstackVtap> getVtaps(OpenstackVtap.Type type);
 
     /**
-     * Returns the vTap with the specified identifier.
+     * Returns the openstack vtap with the specified identifier.
      *
-     * @param vTapId             vTap identifier
-     * @return vtap or null if not found
+     * @param vtapId vtap identifier
+     * @return openstack vtap or null if one with the given identifier is not known
      */
-    OpenstackVtap getVtap(OpenstackVtapId vTapId);
+    OpenstackVtap getVtap(OpenstackVtapId vtapId);
 
     /**
-     * Returns the set of vTaps whose included on device.
+     * Adds the specified device id to the specified vtap entry.
      *
-     * @param type               vTap type
-     * @param deviceId           device identifier
-     * @return set of vTaps
+     * @param vtapId   vtap identifier
+     * @param type     type of vtap (any,rx,tx,all)
+     * @param deviceId device identifier to be added
+     * @return true on success, false otherwise
      */
-    Set<OpenstackVtap> getVtapsByDeviceId(OpenstackVtap.Type type, DeviceId deviceId);
+    boolean addDeviceToVtap(OpenstackVtapId vtapId, OpenstackVtap.Type type, DeviceId deviceId);
+
+    /**
+     * Removes the specified device id from the vtap entry.
+     *
+     * @param vtapId   vtap identifier
+     * @param type     type of vtap (any,rx,tx,all)
+     * @param deviceId device identifier to be removed
+     * @return true on success, false otherwise
+     */
+    boolean removeDeviceFromVtap(OpenstackVtapId vtapId, OpenstackVtap.Type type, DeviceId deviceId);
+
+    /**
+     * Returns a set of openstack vtaps which are associated with the given device.
+     *
+     * @param deviceId device identifier
+     * @return set of openstack vtaps
+     */
+    Set<OpenstackVtap> getVtapsByDeviceId(DeviceId deviceId);
 }
diff --git a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/package-info.java b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/package-info.java
index 77ad58c..fe00c7c 100644
--- a/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/package-info.java
+++ b/apps/openstackvtap/api/src/main/java/org/onosproject/openstackvtap/api/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Application API for Openstack vTap.
+ * Application API for openstack vtap.
  */
 package org.onosproject.openstackvtap.api;
\ No newline at end of file