[ONOS-7905] Add manager and store for k8s network and ports with unit tests

Change-Id: Idd7a8762edbc4bc6d14fd7b22d2218897e7ea0c0
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java
new file mode 100644
index 0000000..aefc940
--- /dev/null
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/Constants.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2016-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.k8snetworking.api;
+
+/**
+ * Provides constants used in OpenStackSwitching.
+ */
+public final class Constants {
+
+    private Constants() {
+    }
+
+    public static final String K8S_NETWORKING_APP_ID = "org.onosproject.k8snetworking";
+}
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java
index 3ac1230..fef1b1c 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sNetwork.java
@@ -29,6 +29,7 @@
     private static final int DEFAULT_MTU = 1500;
 
     private final String networkId;
+    private final String name;
     private final Type type;
     private final Integer mtu;
     private final String segmentId;
@@ -38,9 +39,10 @@
     private static final String NOT_NULL_MSG = "Network % cannot be null";
 
     // private constructor not intended for external invocation
-    private DefaultK8sNetwork(String networkId, Type type, Integer mtu,
+    private DefaultK8sNetwork(String networkId, String name, Type type, Integer mtu,
                               String segmentId, IpAddress gatewayIp, String cidr) {
         this.networkId = networkId;
+        this.name = name;
         this.type = type;
         this.mtu = mtu;
         this.segmentId = segmentId;
@@ -59,6 +61,11 @@
     }
 
     @Override
+    public String name() {
+        return name;
+    }
+
+    @Override
     public Integer mtu() {
         return mtu;
     }
@@ -88,6 +95,7 @@
         }
         DefaultK8sNetwork that = (DefaultK8sNetwork) o;
         return Objects.equal(networkId, that.networkId) &&
+                Objects.equal(name, that.name) &&
                 type == that.type &&
                 Objects.equal(mtu, that.mtu) &&
                 Objects.equal(segmentId, that.segmentId) &&
@@ -97,13 +105,14 @@
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(networkId, type, mtu, segmentId, gatewayIp, cidr);
+        return Objects.hashCode(networkId, name, type, mtu, segmentId, gatewayIp, cidr);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("networkId", networkId)
+                .add("name", name)
                 .add("type", type)
                 .add("mtu", mtu)
                 .add("segmentId", segmentId)
@@ -127,6 +136,7 @@
     public static final class Builder implements K8sNetwork.Builder {
 
         private String networkId;
+        private String name;
         private Type type;
         private Integer mtu;
         private String segmentId;
@@ -136,6 +146,7 @@
         @Override
         public K8sNetwork build() {
             checkArgument(networkId != null, NOT_NULL_MSG, "networkId");
+            checkArgument(name != null, NOT_NULL_MSG, "name");
             checkArgument(type != null, NOT_NULL_MSG, "type");
             checkArgument(segmentId != null, NOT_NULL_MSG, "segmentId");
             checkArgument(gatewayIp != null, NOT_NULL_MSG, "gatewayIp");
@@ -145,7 +156,7 @@
                 mtu = DEFAULT_MTU;
             }
 
-            return new DefaultK8sNetwork(networkId, type, mtu, segmentId, gatewayIp, cidr);
+            return new DefaultK8sNetwork(networkId, name, type, mtu, segmentId, gatewayIp, cidr);
         }
 
         @Override
@@ -155,6 +166,12 @@
         }
 
         @Override
+        public Builder name(String name) {
+            this.name = name;
+            return this;
+        }
+
+        @Override
         public Builder type(Type type) {
             this.type = type;
             return this;
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetwork.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetwork.java
index f971cb9..0ab833e 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetwork.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetwork.java
@@ -58,6 +58,13 @@
     Type type();
 
     /**
+     * Returns kubernetes network name.
+     *
+     * @return kubernetes network name
+     */
+    String name();
+
+    /**
      * Returns maximum transmission unit (MTU) value to address fragmentation.
      *
      * @return maximum transmission unit (MTU) value to address fragmentation
@@ -106,6 +113,14 @@
         Builder networkId(String networkId);
 
         /**
+         * Returns network builder with supplied network name.
+         *
+         * @param name network name
+         * @return network builder
+         */
+        Builder name(String name);
+
+        /**
          * Returns network builder with supplied network type.
          *
          * @param type network type
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkAdminService.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkAdminService.java
index e7f5c18..efa8b6f 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkAdminService.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkAdminService.java
@@ -38,9 +38,8 @@
      * Removes the network.
      *
      * @param networkId network identifier
-     * @return removed network; null if the network does not exist
      */
-    K8sNetwork removeNetwork(String networkId);
+    void removeNetwork(String networkId);
 
     /**
      * Creates a kubernetes port with the given information.
@@ -60,7 +59,11 @@
      * Removes the port.
      *
      * @param portId port identifier
-     * @return removed port; null if the port does not exist
      */
-    K8sPort removePort(String portId);
+    void removePort(String portId);
+
+    /**
+     * Clears the existing network and port states.
+     */
+    void clear();
 }
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkEvent.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkEvent.java
index ea097bc..a39beca 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkEvent.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkEvent.java
@@ -15,22 +15,17 @@
  */
 package org.onosproject.k8snetworking.api;
 
+import org.onlab.util.Tools;
 import org.onosproject.event.AbstractEvent;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
+
 /**
  * Describes kubernetes network service event.
  */
 public class K8sNetworkEvent extends AbstractEvent<K8sNetworkEvent.Type, K8sNetwork> {
 
-    /**
-     * Creates an event of a given type for the specified network.
-     *
-     * @param type kubernetes network event type
-     * @param subject kubernetes network
-     */
-    protected K8sNetworkEvent(Type type, K8sNetwork subject) {
-        super(type, subject);
-    }
+    private final K8sPort port;
 
     /**
      * Kubernetes network events.
@@ -51,5 +46,64 @@
          * Signifies that the kubernetes network is removed.
          */
         K8S_NETWORK_REMOVED,
+
+        /**
+         * Signifies that a new kubernetes port is created.
+         */
+        K8S_PORT_CREATED,
+
+        /**
+         * Signifies that the kubernetes port is updated.
+         */
+        K8S_PORT_UPDATED,
+
+        /**
+         * Signifies that the kubernetes port is removed.
+         */
+        K8S_PORT_REMOVED,
+    }
+
+    /**
+     * Creates an event of a given type for the specified network.
+     *
+     * @param type kubernetes network event type
+     * @param network kubernetes network
+     */
+    public K8sNetworkEvent(Type type, K8sNetwork network) {
+        super(type, network);
+        this.port = null;
+    }
+
+    /**
+     * Creates an event of a given type for the specified network and port.
+     *
+     * @param type kubernetes network event type
+     * @param network kubernetes network
+     * @param port kubernetes port
+     */
+    public K8sNetworkEvent(Type type, K8sNetwork network, K8sPort port) {
+        super(type, network);
+        this.port = port;
+    }
+
+    /**
+     * Returns the kubernetes port of the network event.
+     *
+     * @return kubernetes port; null if the event is not port specific
+     */
+    public K8sPort port() {
+        return port;
+    }
+
+    @Override
+    public String toString() {
+        if (port == null) {
+            return super.toString();
+        }
+        return toStringHelper(this)
+                .add("time", Tools.defaultOffsetDataTime(time()))
+                .add("port", port)
+                .add("network", subject())
+                .toString();
     }
 }
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkStore.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkStore.java
index a5255ff..e4c5ee3 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkStore.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sNetworkStore.java
@@ -62,7 +62,44 @@
     Set<K8sNetwork> networks();
 
     /**
-     * Removes all kubernetes networks.
+     * Creates a new kubernetes port.
+     *
+     * @param port kubernetes port
+     */
+    void createPort(K8sPort port);
+
+    /**
+     * Update the kubernetes port.
+     *
+     * @param port kubernetes port
+     */
+    void updatePort(K8sPort port);
+
+    /**
+     * Removes the kubernetes port with the given port identifier.
+     *
+     * @param portId port identifier
+     * @return port; null if not found
+     */
+    K8sPort removePort(String portId);
+
+    /**
+     * Returns all kubernetes ports.
+     *
+     * @return set of kubernetes ports
+     */
+    Set<K8sPort> ports();
+
+    /**
+     * Return the kubernetes port with the given port identifier.
+     *
+     * @param portId port identifier
+     * @return kubernetes port
+     */
+    K8sPort port(String portId);
+
+    /**
+     * Removes all kubernetes networks and ports.
      */
     void clear();
 }