[ONOS-7926] Implement IPAM service to allocate IP for Kubernetes POD

Change-Id: I32fd1fffb41ec728d0be092ac5a8f555179e7a9e
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java
index cb488b3..605cdea 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/DefaultK8sIpam.java
@@ -24,16 +24,23 @@
  */
 public final class DefaultK8sIpam implements K8sIpam {
 
+    private final String ipamId;
     private final IpAddress ipAddress;
     private final String networkId;
 
     // private constructor not intended for external invocation
-    public DefaultK8sIpam(IpAddress ipAddress, String networkId) {
+    public DefaultK8sIpam(String ipamId, IpAddress ipAddress, String networkId) {
+        this.ipamId = ipamId;
         this.ipAddress = ipAddress;
         this.networkId = networkId;
     }
 
     @Override
+    public String ipamId() {
+        return ipamId;
+    }
+
+    @Override
     public IpAddress ipAddress() {
         return ipAddress;
     }
@@ -52,18 +59,20 @@
             return false;
         }
         DefaultK8sIpam that = (DefaultK8sIpam) o;
-        return Objects.equal(ipAddress, that.ipAddress) &&
+        return Objects.equal(ipamId, that.ipamId) &&
+                Objects.equal(ipAddress, that.ipAddress) &&
                 Objects.equal(networkId, that.networkId);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hashCode(ipAddress, networkId);
+        return Objects.hashCode(ipamId, ipAddress, networkId);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
+                .add("ipamId", ipamId)
                 .add("ipAddress", ipAddress)
                 .add("networkId", networkId)
                 .toString();
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java
index 9969f30..cc57058 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpam.java
@@ -23,6 +23,13 @@
 public interface K8sIpam {
 
     /**
+     * Returns the IPAM identifier.
+     *
+     * @return IPAM identifier
+     */
+    String ipamId();
+
+    /**
      * Returns the IP address.
      *
      * @return IP address
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamAdminService.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamAdminService.java
index f34421a..d8752f8 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamAdminService.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamAdminService.java
@@ -17,6 +17,8 @@
 
 import org.onlab.packet.IpAddress;
 
+import java.util.Set;
+
 /**
  * IP Address Management admin service for kubernetes network.
  */
@@ -31,10 +33,26 @@
     IpAddress allocateIp(String networkId);
 
     /**
-     * Leases the IP address from the given network.
+     * Releases the IP address from the given network.
      *
      * @param networkId network identifier
-     * @return leased IP address
+     * @param ipAddress IP address
+     * @return true if the given IP was successfully released, false otherwise
      */
-    IpAddress leaseIp(String networkId);
+    boolean releaseIp(String networkId, IpAddress ipAddress);
+
+    /**
+     * Initializes IP address pool.
+     *
+     * @param networkId network identifier
+     * @param ipAddresses a set of IP addresses contained in this IP pool
+     */
+    void initializeIpPool(String networkId, Set<IpAddress> ipAddresses);
+
+    /**
+     * Purges the existing IP address pool of the given network identifier.
+     *
+     * @param networkId network identifier
+     */
+    void purgeIpPool(String networkId);
 }
diff --git a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamStore.java b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamStore.java
index bcd1d1f..5a88756 100644
--- a/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamStore.java
+++ b/apps/k8s-networking/api/src/main/java/org/onosproject/k8snetworking/api/K8sIpamStore.java
@@ -15,7 +15,6 @@
  */
 package org.onosproject.k8snetworking.api;
 
-import org.onlab.packet.IpAddress;
 import org.onosproject.store.Store;
 
 import java.util.Set;
@@ -26,48 +25,88 @@
 public interface K8sIpamStore extends Store<K8sIpamEvent, K8sIpamStoreDelegate> {
 
     /**
-     * Allocates a new IP address.
+     * Creates a new allocated IP address.
      *
-     * @param networkId network identifier
-     * @return newly allocated IP address
+     * @param ipam IPAM instance
      */
-    IpAddress allocateIp(String networkId);
+    void createAllocatedIp(K8sIpam ipam);
 
     /**
-     * Leases the existing IP address.
+     * Updates the existing allocated IP address.
      *
-     * @param networkId network identifier
-     * @return leased IP address
+     * @param ipam IPAM instance
      */
-    IpAddress leaseIp(String networkId);
+    void updateAllocatedIp(K8sIpam ipam);
 
     /**
-     * Initializes a new IP pool with the given network.
+     * Removes the existing allocated IP address.
      *
-     * @param networkId network identifier
+     * @param ipamId IPAM identifier
+     * @return removed IPAM instance; null if failed
      */
-    void initializeIpPool(String networkId);
+    K8sIpam removeAllocatedIp(String ipamId);
 
     /**
-     * Purges an existing IP pool associated with the given network.
+     * Returns the IPAM with the given IPAM identifier.
      *
-     * @param networkId network identifier
+     * @param ipamId IPAM identifier
+     * @return IPAM; null it not found
      */
-    void purgeIpPool(String networkId);
+    K8sIpam allocatedIp(String ipamId);
 
     /**
-     * Returns the already allocated IP addresses.
+     * Returns all allocated IPAM instances.
      *
-     * @param networkId network identifier
-     * @return allocated IP addresses
+     * @return set of IPAM instances
      */
-    Set<IpAddress> allocatedIps(String networkId);
+    Set<K8sIpam> allocatedIps();
 
     /**
-     * Returns the available IP addresses.
+     * Creates a new available IP address.
+     *
+     * @param ipam IPAM instance
+     */
+    void createAvailableIp(K8sIpam ipam);
+
+    /**
+     * Updates the existing available IP address.
+     *
+     * @param ipam IPAM instance
+     */
+    void updateAvailableIp(K8sIpam ipam);
+
+    /**
+     * Removes the existing available IP address.
+     *
+     * @param ipamId IPAM identifier
+     * @return remved IPAM instance; null if failed
+     */
+    K8sIpam removeAvailableIp(String ipamId);
+
+    /**
+     * Returns the IPAM with the given IPAM identifier.
+     *
+     * @param ipamId IPAM identifier
+     * @return IPAM; null it not found
+     */
+    K8sIpam availableIp(String ipamId);
+
+    /**
+     * Returns all available IPAM instances.
+     *
+     * @return set of IPAM instances
+     */
+    Set<K8sIpam> availableIps();
+
+    /**
+     * Clears all allocated and available IP addresses.
+     */
+    void clear();
+
+    /**
+     * Clears allocated and available IP addresses associated with the given network.
      *
      * @param networkId network identifier
-     * @return available IP addresses
      */
-    Set<IpAddress> availableIps(String networkId);
+    void clear(String networkId);
 }