Notify kubevirt router internal and external network related events

1. Add networkName attribute into FloatingIp class.

Change-Id: I4aeb8031ef4c86d7ae9a6423276b024c05fe0649
(cherry picked from commit 4acd4543cf7e6d48883ed0f7d9813b69f0d2c414)
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java
index 6dc98e2..213fa4e 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtFloatingIp.java
@@ -32,6 +32,7 @@
     private final String id;
     private final String routerName;
     private final String podName;
+    private final String networkName;
     private final IpAddress floatingIp;
     private final IpAddress fixedIp;
 
@@ -41,14 +42,16 @@
      * @param id            floating IP identifier
      * @param routerName    router name
      * @param podName       POD name
+     * @param networkName   network name
      * @param floatingIp    floating IP address
      * @param fixedIp       fixed IP address
      */
     public DefaultKubevirtFloatingIp(String id, String routerName, String podName,
-                                     IpAddress floatingIp, IpAddress fixedIp) {
+                                     String networkName, IpAddress floatingIp, IpAddress fixedIp) {
         this.id = id;
         this.routerName = routerName;
         this.podName = podName;
+        this.networkName = networkName;
         this.floatingIp = floatingIp;
         this.fixedIp = fixedIp;
     }
@@ -64,6 +67,11 @@
     }
 
     @Override
+    public String networkName() {
+        return networkName;
+    }
+
+    @Override
     public IpAddress floatingIp() {
         return floatingIp;
     }
@@ -82,6 +90,7 @@
     public KubevirtFloatingIp updateFixedIp(IpAddress ip) {
         return DefaultKubevirtFloatingIp.builder()
                 .id(id)
+                .networkName(networkName)
                 .routerName(routerName)
                 .floatingIp(floatingIp)
                 .fixedIp(ip)
@@ -93,6 +102,7 @@
     public KubevirtFloatingIp updatePodName(String name) {
         return DefaultKubevirtFloatingIp.builder()
                 .id(id)
+                .networkName(networkName)
                 .routerName(routerName)
                 .floatingIp(floatingIp)
                 .fixedIp(fixedIp)
@@ -111,6 +121,7 @@
         DefaultKubevirtFloatingIp that = (DefaultKubevirtFloatingIp) o;
         return id.equals(that.id) && routerName.equals(that.routerName) &&
                 Objects.equals(podName, that.podName) &&
+                networkName.equals(that.networkName) &&
                 floatingIp.equals(that.floatingIp) &&
                 Objects.equals(fixedIp, that.fixedIp);
     }
@@ -126,6 +137,7 @@
                 .add("id", id)
                 .add("routerName", routerName)
                 .add("podName", podName)
+                .add("networkName", networkName)
                 .add("floatingIp", floatingIp)
                 .add("fixedIp", fixedIp)
                 .toString();
@@ -145,16 +157,18 @@
         private String id;
         private String routerName;
         private String podName;
+        private String networkName;
         private IpAddress floatingIp;
         private IpAddress fixedIp;
 
         @Override
         public KubevirtFloatingIp build() {
             checkArgument(id != null, NOT_NULL_MSG, "id");
+            checkArgument(networkName != null, NOT_NULL_MSG, "networkName");
             checkArgument(routerName != null, NOT_NULL_MSG, "routerName");
             checkArgument(floatingIp != null, NOT_NULL_MSG, "floatingIp");
 
-            return new DefaultKubevirtFloatingIp(id, routerName, podName, floatingIp, fixedIp);
+            return new DefaultKubevirtFloatingIp(id, routerName, podName, networkName, floatingIp, fixedIp);
         }
 
         @Override
@@ -170,6 +184,12 @@
         }
 
         @Override
+        public Builder networkName(String name) {
+            this.networkName = name;
+            return this;
+        }
+
+        @Override
         public Builder floatingIp(IpAddress ip) {
             this.floatingIp = ip;
             return this;
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
index 4bf04a2..98653d9 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/DefaultKubevirtRouter.java
@@ -80,12 +80,20 @@
 
     @Override
     public Set<String> internal() {
-        return ImmutableSet.copyOf(internal);
+        if (internal == null) {
+            return ImmutableSet.of();
+        } else {
+            return ImmutableSet.copyOf(internal);
+        }
     }
 
     @Override
     public Map<String, String> external() {
-        return ImmutableMap.copyOf(external);
+        if (external == null) {
+            return ImmutableMap.of();
+        } else {
+            return ImmutableMap.copyOf(external);
+        }
     }
 
     @Override
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java
index f879d2b..27019b8 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtFloatingIp.java
@@ -37,6 +37,13 @@
     String routerName();
 
     /**
+     * Returns the name of network where the floating IPs are belong to.
+     *
+     * @return name of network
+     */
+    String networkName();
+
+    /**
      * Returns the floating IP address.
      *
      * @return floating IP address
@@ -98,6 +105,14 @@
         Builder routerName(String name);
 
         /**
+         * Returns kubevirt floating IP builder with supplied network name.
+         *
+         * @param name network name
+         * @return floating IP builder
+         */
+        Builder networkName(String name);
+
+        /**
          * Returns kubevirt floating IP builder with supplied floating IP address.
          *
          * @param ip floating IP address
diff --git a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouterEvent.java b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouterEvent.java
index c9e1f16..7fd8958 100644
--- a/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouterEvent.java
+++ b/apps/kubevirt-networking/api/src/main/java/org/onosproject/kubevirtnetworking/api/KubevirtRouterEvent.java
@@ -17,6 +17,8 @@
 
 import org.onosproject.event.AbstractEvent;
 
+import java.util.Set;
+
 import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
@@ -26,6 +28,10 @@
 
     private final KubevirtFloatingIp floatingIp;
     private final String podName;
+    private final Set<String> internal;
+    private final String externalIp;
+    private final String externalNet;
+    private final String peerRouterIp;
 
     /**
      * Creates an event of a given type for the specified kubevirt router.
@@ -37,6 +43,10 @@
         super(type, subject);
         this.floatingIp = null;
         this.podName = null;
+        this.internal = null;
+        this.externalIp = null;
+        this.externalNet = null;
+        this.peerRouterIp = null;
     }
 
     /**
@@ -50,6 +60,10 @@
         super(type, subject);
         this.floatingIp = floatingIp;
         this.podName = null;
+        this.internal = null;
+        this.externalIp = null;
+        this.externalNet = null;
+        this.peerRouterIp = null;
     }
 
     /**
@@ -64,6 +78,48 @@
         super(type, subject);
         this.floatingIp = floatingIp;
         this.podName = podName;
+        this.internal = null;
+        this.externalIp = null;
+        this.externalNet = null;
+        this.peerRouterIp = null;
+    }
+
+    /**
+     * Creates an event of a given type for the specified kubevirt router.
+     *
+     * @param type        kubevirt router event type
+     * @param subject     kubevirt router
+     * @param internal    internal networks attached to the router
+     */
+    public KubevirtRouterEvent(Type type, KubevirtRouter subject, Set<String> internal) {
+        super(type, subject);
+        this.internal = internal;
+        this.podName = null;
+        this.floatingIp = null;
+        this.externalIp = null;
+        this.externalNet = null;
+        this.peerRouterIp = null;
+    }
+
+    /**
+     * Creates an event of a given type for the specified kubevirt router.
+     *
+     * @param type          kubevirt router event type
+     * @param subject       kubevirt router
+     * @param externalIp    virtual router's IP address included in external network
+     * @param externalNet   external network name
+     * @param peerRouterIp  external peer router IP address
+     */
+    public KubevirtRouterEvent(Type type, KubevirtRouter subject,
+                               String externalIp, String externalNet,
+                               String peerRouterIp) {
+        super(type, subject);
+        this.internal = null;
+        this.podName = null;
+        this.floatingIp = null;
+        this.externalIp = externalIp;
+        this.externalNet = externalNet;
+        this.peerRouterIp = peerRouterIp;
     }
 
     public enum Type {
@@ -83,6 +139,26 @@
         KUBEVIRT_ROUTER_REMOVED,
 
         /**
+         * Signifies that a new external network is added to the router.
+         */
+        KUBEVIRT_ROUTER_EXTERNAL_NETWORK_ATTACHED,
+
+        /**
+         * Signifies that the existing external network is removed from the router.
+         */
+        KUBEVIRT_ROUTER_EXTERNAL_NETWORK_DETACHED,
+
+        /**
+         * Signifies that a new internal network is added to the router.
+         */
+        KUBEVIRT_ROUTER_INTERNAL_NETWORKS_ATTACHED,
+
+        /**
+         * Signifies that the existing internal network is removed from the router.
+         */
+        KUBEVIRT_ROUTER_INTERNAL_NETWORKS_DETACHED,
+
+        /**
          * Signifies that a new kubevirt floating IP is created.
          */
         KUBEVIRT_FLOATING_IP_CREATED,
@@ -136,6 +212,10 @@
                 .add("router", subject())
                 .add("floatingIp", floatingIp)
                 .add("podName", podName)
+                .add("internal", internal)
+                .add("externalIp", externalIp)
+                .add("externalNet", externalNet)
+                .add("peerRouterIp", peerRouterIp)
                 .toString();
     }
 }