Implement kubernetes external loadbalancer handler.

Change-Id: I0f3057d66769f0ca7db7d508483835cdd1ff1593
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
index 3d2f14c..0957fb7 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/Constants.java
@@ -49,4 +49,11 @@
     public static final String DEFAULT_CLUSTER_NAME = "default";
 
     public static final String SONA_PROJECT_DOMAIN = "sonaproject.github.io";
+
+    // CLI item length
+    public static final int CLI_NAME_LENGTH = 30;
+    public static final int CLI_IP_ADDRESSES_LENGTH = 50;
+    public static final int CLI_IP_ADDRESS_LENGTH = 25;
+    public static final int CLI_MAC_ADDRESS_LENGTH = 25;
+    public static final int CLI_MARGIN_LENGTH = 2;
 }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbConfig.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbConfig.java
new file mode 100644
index 0000000..1147ac7
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbConfig.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+/**
+ * Default implementation of kubernetes external lb config.
+ */
+public final class DefaultKubernetesExternalLbConfig implements KubernetesExternalLbConfig {
+
+    private static final String NOT_NULL_MSG = "ExternalLbConfig % cannot be null";
+
+    private final String configName;
+    private final IpAddress loadBalancerGwIp;
+    private final MacAddress loadBalancerGwMac;
+    private final String globalIpRange;
+
+    public DefaultKubernetesExternalLbConfig(String configName, IpAddress loadBalancerGwIp,
+                                             MacAddress loadBalancerGwMac, String globalIpRange) {
+        this.configName = configName;
+        this.loadBalancerGwIp = loadBalancerGwIp;
+        this.loadBalancerGwMac = loadBalancerGwMac;
+        this.globalIpRange = globalIpRange;
+    }
+
+    @Override
+    public String configName() {
+        return configName;
+    }
+
+    @Override
+    public IpAddress loadBalancerGwIp() {
+        return loadBalancerGwIp;
+    }
+
+    @Override
+    public MacAddress loadBalancerGwMac() {
+        return loadBalancerGwMac;
+    }
+
+    @Override
+    public String globalIpRange() {
+        return globalIpRange;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        DefaultKubernetesExternalLbConfig that = (DefaultKubernetesExternalLbConfig) o;
+
+        return Objects.equals(configName, that.configName) &&
+                Objects.equals(loadBalancerGwIp, that.loadBalancerGwIp) &&
+                Objects.equals(globalIpRange, that.globalIpRange);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(configName, loadBalancerGwIp, globalIpRange);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("configName", configName)
+                .add("loadBalancerGwIp", loadBalancerGwIp)
+                .add("loadBalancerGwMac", loadBalancerGwMac)
+                .add("globalIpRange", globalIpRange)
+                .toString();
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public KubernetesExternalLbConfig updateLbGatewayMac(MacAddress gatewayMac) {
+        return DefaultKubernetesExternalLbConfig.builder()
+                .configName(configName)
+                .loadBalancerGwIp(loadBalancerGwIp)
+                .loadBalancerGwMac(loadBalancerGwMac)
+                .globalIpRange(globalIpRange)
+                .build();
+    }
+
+    public static final class Builder implements KubernetesExternalLbConfig.Builder {
+
+        private String configName;
+        private IpAddress loadBalancerGwIp;
+        private MacAddress loadBalancerGwMac;
+        private String globalIpRange;
+
+        private Builder() {
+        }
+
+        @Override
+        public KubernetesExternalLbConfig build() {
+            checkArgument(configName != null, NOT_NULL_MSG, "configName");
+            checkArgument(loadBalancerGwIp != null, NOT_NULL_MSG, "loadBalancerGwIp");
+            checkArgument(globalIpRange != null, NOT_NULL_MSG, "globalIpRange");
+
+            return new DefaultKubernetesExternalLbConfig(configName, loadBalancerGwIp,
+                    loadBalancerGwMac, globalIpRange);
+        }
+
+        @Override
+        public Builder configName(String configName) {
+            this.configName = configName;
+            return this;
+        }
+
+        @Override
+        public Builder loadBalancerGwIp(IpAddress loadBalancerGwIp) {
+            this.loadBalancerGwIp = loadBalancerGwIp;
+            return this;
+        }
+
+        @Override
+        public KubernetesExternalLbConfig.Builder loadBalancerGwMac(MacAddress loadBalancerGwMac) {
+            this.loadBalancerGwMac = loadBalancerGwMac;
+            return this;
+        }
+
+        @Override
+        public Builder globalIpRange(String globalIpRange) {
+            this.globalIpRange = globalIpRange;
+            return this;
+        }
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbInterface.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbInterface.java
new file mode 100644
index 0000000..fe53b53
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubernetesExternalLbInterface.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import com.google.common.base.MoreObjects;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+public class DefaultKubernetesExternalLbInterface implements KubernetesExternalLbInterface {
+
+    private static final String NOT_NULL_MSG = "KubernetesExternalLbInterface % cannot be null";
+
+    private String elbBridgeName;
+    private IpAddress elbIp;
+    private IpAddress elbGwIp;
+    private MacAddress elbGwMac;
+
+    public DefaultKubernetesExternalLbInterface(String elbBridgeName, IpAddress elbIp,
+                                                IpAddress elbGwIp, MacAddress elbGwMac) {
+        this.elbBridgeName = elbBridgeName;
+        this.elbIp = elbIp;
+        this.elbGwIp = elbGwIp;
+        this.elbGwMac = elbGwMac;
+    }
+
+    @Override
+    public String externalLbBridgeName() {
+        return elbBridgeName;
+    }
+
+    @Override
+    public IpAddress externalLbIp() {
+        return elbIp;
+    }
+
+    @Override
+    public IpAddress externalLbGwIp() {
+        return elbGwIp;
+    }
+
+    @Override
+    public MacAddress externalLbGwMac() {
+        return elbGwMac;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        DefaultKubernetesExternalLbInterface that = (DefaultKubernetesExternalLbInterface) o;
+
+        return Objects.equals(elbBridgeName, that.elbBridgeName) &&
+                Objects.equals(elbIp, that.elbIp) &&
+                Objects.equals(elbGwIp, that.elbGwIp);
+    }
+
+    @Override
+    public String toString() {
+        return MoreObjects.toStringHelper(this)
+                .add("elbBridgeName", elbBridgeName)
+                .add("elbIp", elbIp)
+                .add("elbGwIp", elbGwIp)
+                .add("elbGwMac", elbGwMac)
+                .toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(elbBridgeName, elbIp, elbGwIp);
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static final class Builder implements KubernetesExternalLbInterface.Builder {
+        private String elbBridgeName;
+        private IpAddress elbIp;
+        private IpAddress elbGwIp;
+        private MacAddress elbGwMac;
+
+        private Builder() {
+        }
+
+        @Override
+        public KubernetesExternalLbInterface build() {
+            checkArgument(elbBridgeName != null, NOT_NULL_MSG, "externalLbBridgeName");
+            checkArgument(elbIp != null, NOT_NULL_MSG, "externalLbIp");
+            checkArgument(elbGwIp != null, NOT_NULL_MSG, "externalLbGwIp");
+            checkArgument(elbGwMac != null, NOT_NULL_MSG, "externalLbGwMac");
+
+            return new DefaultKubernetesExternalLbInterface(elbBridgeName, elbIp, elbGwIp, elbGwMac);
+        }
+
+        @Override
+        public Builder externalLbBridgeName(String elbBridgeName) {
+            this.elbBridgeName = elbBridgeName;
+            return this;
+        }
+
+        @Override
+        public Builder externalLbIp(IpAddress elbIp) {
+            this.elbIp = elbIp;
+            return this;
+        }
+
+        @Override
+        public Builder externallbGwIp(IpAddress elbGwIp) {
+            this.elbGwIp = elbGwIp;
+            return this;
+        }
+
+        @Override
+        public Builder externalLbGwMac(MacAddress elbGwMac) {
+            this.elbGwMac = elbGwMac;
+            return this;
+        }
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
index 16f7034..2c3d0be 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/DefaultKubevirtNode.java
@@ -59,10 +59,7 @@
     private final KubevirtNodeState state;
     private final Collection<KubevirtPhyInterface> phyIntfs;
     private final String gatewayBridgeName;
-    private final String elbBridgeName;
-    private final IpAddress elbIp;
-    private final IpAddress elbGwIp;
-    private final MacAddress elbGwMac;
+    private final KubernetesExternalLbInterface kubernetesExternalLbIntf;
 
     /**
      * A default constructor of kubevirt node.
@@ -77,18 +74,15 @@
      * @param state             node state
      * @param phyIntfs          physical interfaces
      * @param gatewayBridgeName  gateway bridge name
-     * @param elbBridgeName     elb bridge name
-     * @param elbIp             elb IP address
-     * @param elbGwIp           elb gw IP address
-     * @param elbGwMac          elb gw MAC address
+     * @param kubernetesExternalLbIntf kubernetesExternalLbIntf
      */
     protected DefaultKubevirtNode(String clusterName, String hostname, Type type,
                                   DeviceId intgBridge, DeviceId tunBridge,
                                   IpAddress managementIp, IpAddress dataIp,
                                   KubevirtNodeState state,
                                   Collection<KubevirtPhyInterface> phyIntfs,
-                                  String gatewayBridgeName, String elbBridgeName, IpAddress elbIp,
-                                  IpAddress elbGwIp, MacAddress elbGwMac) {
+                                  String gatewayBridgeName,
+                                  KubernetesExternalLbInterface kubernetesExternalLbIntf) {
         this.clusterName = clusterName;
         this.hostname = hostname;
         this.type = type;
@@ -99,10 +93,7 @@
         this.state = state;
         this.phyIntfs = phyIntfs;
         this.gatewayBridgeName = gatewayBridgeName;
-        this.elbBridgeName = elbBridgeName;
-        this.elbIp = elbIp;
-        this.elbGwIp = elbGwIp;
-        this.elbGwMac = elbGwMac;
+        this.kubernetesExternalLbIntf = kubernetesExternalLbIntf;
     }
 
     @Override
@@ -163,10 +154,7 @@
                 .state(newState)
                 .phyIntfs(phyIntfs)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbIntf)
                 .build();
     }
 
@@ -183,10 +171,7 @@
                 .state(state)
                 .phyIntfs(phyIntfs)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbIntf)
                 .build();
     }
 
@@ -203,10 +188,7 @@
                 .state(state)
                 .phyIntfs(phyIntfs)
                 .gatewayBridgeName(gatewayBridgeName)
-                .elbBridgeName(elbBridgeName)
-                .elbIp(elbIp)
-                .elbGwIp(elbGwIp)
-                .elbGwMac(elbGwMac)
+                .kubernetesExternalLbInterface(kubernetesExternalLbIntf)
                 .build();
     }
 
@@ -259,23 +241,8 @@
     }
 
     @Override
-    public String elbBridgeName() {
-        return elbBridgeName;
-    }
-
-    @Override
-    public IpAddress elbIp() {
-        return elbIp;
-    }
-
-    @Override
-    public IpAddress elbGwIp() {
-        return elbGwIp;
-    }
-
-    @Override
-    public MacAddress elbGwMac() {
-        return elbGwMac;
+    public KubernetesExternalLbInterface kubernetesExternalLbInterface() {
+        return kubernetesExternalLbIntf;
     }
 
     private PortNumber tunnelPort(String tunnelType) {
@@ -343,10 +310,7 @@
                 .state(node.state())
                 .phyIntfs(node.phyIntfs())
                 .gatewayBridgeName(node.gatewayBridgeName())
-                .elbBridgeName(node.elbBridgeName())
-                .elbIp(node.elbIp())
-                .elbGwIp(node.elbGwIp())
-                .elbGwMac(node.elbGwMac());
+                .kubernetesExternalLbInterface(node.kubernetesExternalLbInterface());
     }
 
     @Override
@@ -386,10 +350,7 @@
                 .add("state", state)
                 .add("phyIntfs", phyIntfs)
                 .add("gatewayBridgeName", gatewayBridgeName)
-                .add("elbBridgeName", elbBridgeName)
-                .add("elbIp", elbIp)
-                .add("elbGwIp", elbGwIp)
-                .add("elbGwMac", elbGwMac)
+                .add("kubernetesExternalLbInterface", kubernetesExternalLbIntf)
                 .toString();
     }
 
@@ -409,6 +370,7 @@
         private IpAddress elbIp;
         private IpAddress elbGwIp;
         private MacAddress elbGwMac;
+        private KubernetesExternalLbInterface kubernetesExternalLbInterface;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -436,10 +398,7 @@
                     state,
                     phyIntfs,
                     gatewayBridgeName,
-                    elbBridgeName,
-                    elbIp,
-                    elbGwIp,
-                    elbGwMac
+                    kubernetesExternalLbInterface
             );
         }
 
@@ -504,26 +463,8 @@
         }
 
         @Override
-        public Builder elbBridgeName(String elbBridgeName) {
-            this.elbBridgeName = elbBridgeName;
-            return this;
-        }
-
-        @Override
-        public Builder elbIp(IpAddress elbIp) {
-            this.elbIp = elbIp;
-            return this;
-        }
-
-        @Override
-        public Builder elbGwIp(IpAddress elbGwIp) {
-            this.elbGwIp = elbGwIp;
-            return this;
-        }
-
-        @Override
-        public Builder elbGwMac(MacAddress elbGwMac) {
-            this.elbGwMac = elbGwMac;
+        public Builder kubernetesExternalLbInterface(KubernetesExternalLbInterface kubernetesExternalLbInterface) {
+            this.kubernetesExternalLbInterface = kubernetesExternalLbInterface;
             return this;
         }
     }
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfig.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfig.java
new file mode 100644
index 0000000..a0f1e90
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfig.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+/**
+ * Representation of configuration used in Kubernetes External Lb service.
+ */
+public interface KubernetesExternalLbConfig {
+
+    /**
+     * Returns the name of kubernetes external lb config.
+     * This is defined in the configmap.
+     *
+     * @return config name
+     */
+    String configName();
+    /**
+     * Returns the gateway IP of load balancer.
+     * TEG would send outbound traffic to this gateway.
+     *
+     * @return load balancer gateway IP
+     */
+    IpAddress loadBalancerGwIp();
+
+    /**
+     * Returns the gateway MAC of load balancer.
+     * TEG would send outbound traffic to this gateway.
+     *
+     * @return load balancer gateway IP
+     */
+    MacAddress loadBalancerGwMac();
+
+    /**
+     * Returns the global IP range used in external LB.
+     * Each service of type LoadBalancer would get the public IP out of those.
+     * Format: "223.39.6.85-223.39.6.90"
+     *
+     * @return global Ip range
+     */
+    String globalIpRange();
+
+    /**
+     * Returns the KubernetesExternalLbConfig with updated external lb gateway mac address.
+     *
+     * @param gatewayMac external lb gateway mac address
+     * @return KubernetesExternalLbConfig
+     */
+    KubernetesExternalLbConfig updateLbGatewayMac(MacAddress gatewayMac);
+
+    interface Builder {
+        /**
+         * Builds an immutable kubernal external lb config instance.
+         *
+         * @return kubernetes external lb config
+         */
+        KubernetesExternalLbConfig build();
+
+        /**
+         * Returns kubernetes external lb config builder with supplied config name.
+         *
+         * @param configName config name
+         * @return kubernetes external lb config builder
+         */
+        Builder configName(String configName);
+
+        /**
+         * Returns kubernetes external lb config builder with supplied loadbalancer gw Ip.
+         *
+         * @param loadBalancerGwIp loadbalancer gw Ip
+         * @return kubernetes external lb config builder
+         */
+        Builder loadBalancerGwIp(IpAddress loadBalancerGwIp);
+
+        /**
+         * Returns kubernetes external lb config builder with supplied loadbalancer gw Mac.
+         *
+         * @param loadBalancerGwMac loadbalancer gw Mac
+         * @return kubernetes external lb config builder
+         */
+        Builder loadBalancerGwMac(MacAddress loadBalancerGwMac);
+
+        /**
+         * Returns kubernetes external lb config builder with supplied global Ip range.
+         *
+         * @param globalIpRange global Ip range
+         * @return kubernetes external lb config builder
+         */
+        Builder globalIpRange(String globalIpRange);
+
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigAdminService.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigAdminService.java
new file mode 100644
index 0000000..36e163f
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigAdminService.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+/**
+ * Service for administering inventory of Kubernetes External Lb Configs.
+ */
+public interface KubernetesExternalLbConfigAdminService extends KubernetesExternalLbConfigService {
+
+    /**
+     * Creates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void createKubernetesExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Updates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void updateKubernetesExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Removes a new kubernetes external lb config.
+     *
+     * @param configName kubernetes external lb config
+     */
+    void removeKubernetesExternalLbConfig(String configName);
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigEvent.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigEvent.java
new file mode 100644
index 0000000..c42ed31
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigEvent.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onosproject.event.AbstractEvent;
+
+public class KubernetesExternalLbConfigEvent
+        extends AbstractEvent<KubernetesExternalLbConfigEvent.Type, KubernetesExternalLbConfig> {
+
+    public KubernetesExternalLbConfigEvent(Type type, KubernetesExternalLbConfig subject) {
+        super(type, subject);
+    }
+
+    /**
+     * Kubernetes external lb config events.
+     */
+    public enum Type {
+        /**
+         * Signifies that a new config is created.
+         */
+        KUBERNETES_EXTERNAL_LB_CONFIG_CREATED,
+
+        /**
+         * Signifies that a new config is updated.
+         */
+        KUBERNETES_EXTERNAL_LB_CONFIG_UPDATED,
+
+        /**
+         * Signifies that a new config is removed.
+         */
+        KUBERNETES_EXTERNAL_LB_CONFIG_REMOVED
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigListener.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigListener.java
new file mode 100644
index 0000000..a91d048
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigListener.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onosproject.event.EventListener;
+
+/**
+ * Listener for kubernetes external lb config event.
+ */
+public interface KubernetesExternalLbConfigListener extends EventListener<KubernetesExternalLbConfigEvent> {
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigService.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigService.java
new file mode 100644
index 0000000..32e07e5
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigService.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onosproject.event.ListenerService;
+
+import java.util.Set;
+
+/**
+ * Service for administering the inventory of kubernetes external lb configs.
+ */
+public interface KubernetesExternalLbConfigService
+        extends ListenerService<KubernetesExternalLbConfigEvent, KubernetesExternalLbConfigListener> {
+    String APP_ID = "org.onosproject.kubevirtnode";
+
+    /**
+     * Returns the kubernetes external lb config with the given config name.
+     *
+     * @param configName config name
+     * @return kubernetes external lb config
+     */
+    KubernetesExternalLbConfig lbConfig(String configName);
+
+    /**
+     * Returns all kubernetes external lb configs.
+     *
+     * @return set of kubernetes external lb configs
+     */
+    Set<KubernetesExternalLbConfig> lbConfigs();
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStore.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStore.java
new file mode 100644
index 0000000..9a1e366
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStore.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onosproject.store.Store;
+
+import java.util.Set;
+
+/**
+ * Manages inventory of kubernetes external lb config states; not intended for direct use.
+ */
+public interface KubernetesExternalLbConfigStore
+        extends Store<KubernetesExternalLbConfigEvent, KubernetesExternalLbConfigStoreDelegate> {
+
+    /**
+     * Creates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void createExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Updates a new kubernetes external lb config.
+     *
+     * @param lbConfig kubernetes external lb config
+     */
+    void updateExternalLbConfig(KubernetesExternalLbConfig lbConfig);
+
+    /**
+     * Removes a new kubernetes external lb config.
+     *
+     * @param configName kubernetes external lb config
+     * @return removed kubernetes external lb config
+     */
+    KubernetesExternalLbConfig removeExternalLbConfig(String configName);
+
+    /**
+     * Returns the kubernetes external lb config with the given config name.
+     *
+     * @param configName config name
+     * @return kubernetes external lb config
+     */
+    KubernetesExternalLbConfig externalLbConfig(String configName);
+
+    /**
+     * Returns all kubernetes external lb configs.
+     *
+     * @return set of kubernetes external lb configs
+     */
+    Set<KubernetesExternalLbConfig> externalLbConfigs();
+
+    /**
+     * Removes all kubernetes external lb configs.
+     */
+    void clear();
+
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStoreDelegate.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStoreDelegate.java
new file mode 100644
index 0000000..12e5e11
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbConfigStoreDelegate.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onosproject.store.StoreDelegate;
+
+/**
+ * Kubernetes external lb config store delegate abstraction.
+ */
+public interface KubernetesExternalLbConfigStoreDelegate extends StoreDelegate<KubernetesExternalLbConfigEvent> {
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbInterface.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbInterface.java
new file mode 100644
index 0000000..df9081f
--- /dev/null
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubernetesExternalLbInterface.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2022-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.kubevirtnode.api;
+
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
+
+/**
+ * Representation of a Kubernetes external load balancer interface for kubevirt node.
+ */
+public interface KubernetesExternalLbInterface {
+
+    /**
+     *  Returns the name of the elb bridge.
+     *  Using this bridge, TEG internally communicates with data IP's in worker nodes.
+     *
+     * @return gateway bridge name
+     */
+    String externalLbBridgeName();
+
+    /**
+     *  Returns the internal Ip Address of TEG for kubernetes external lb purpose.
+     *
+     * @return elb ip address
+     */
+    IpAddress externalLbIp();
+
+    /**
+     *  Returns the gateway IP of the elb IP.
+     *
+     * @return elb gw ip address
+     */
+    IpAddress externalLbGwIp();
+
+    /**
+     *  Returns the mac address of the elb gw.
+     *
+     * @return elb gw mac address
+     */
+    MacAddress externalLbGwMac();
+
+
+    interface Builder {
+
+        /**
+         * Builds an immutable kubernetes external load balancer interface instance.
+         *
+         * @return  external load balancer interface instance
+         */
+        KubernetesExternalLbInterface build();
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied elb bridge name.
+         *
+         * @param elbBridgeName elb bridge name
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externalLbBridgeName(String elbBridgeName);
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied supplied elb Ip address.
+         *
+         * @param elbIp elb ip address
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externalLbIp(IpAddress elbIp);
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied supplied elb gw Ip address.
+         *
+         * @param elbGwIp elb gw ip address
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externallbGwIp(IpAddress elbGwIp);
+
+        /**
+         * Returns kubernetes external load balancer interface builder with supplied supplied elb gw MAC address.
+         *
+         * @param elbGwMac elb gw mac address
+         * @return kubernetes external load balancer interface builder
+         */
+        Builder externalLbGwMac(MacAddress elbGwMac);
+    }
+}
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
index 0015105..502784d 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
@@ -16,7 +16,6 @@
 package org.onosproject.kubevirtnode.api;
 
 import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 
@@ -190,34 +189,11 @@
     String gatewayBridgeName();
 
     /**
-     *  Returns the name of the elb bridge.
-     *  Using this bridge, TEG internally communicates with data IP's in worker nodes.
+     *  Returns the kubernetesExternalLbInterface.
      *
-     * @return gateway bridge name
+     * @return kubernetesExternalLbInterface
      */
-    String elbBridgeName();
-
-    /**
-     *  Returns the internal Ip Address of TEG for kubernetes external lb purpose.
-     *
-     * @return elb ip address
-     */
-    IpAddress elbIp();
-
-    /**
-     *  Returns the gateway IP of the elb IP.
-     *
-     * @return elb gw ip address
-     */
-    IpAddress elbGwIp();
-
-    /**
-     *  Returns the mac address of the elb gw.
-     *
-     * @return elb gw mac address
-     */
-    MacAddress elbGwMac();
-
+    KubernetesExternalLbInterface kubernetesExternalLbInterface();
 
     /**
      * Builder of new node entity.
@@ -310,36 +286,13 @@
          */
         KubevirtNode.Builder gatewayBridgeName(String gatewayBridgeName);
 
-        /**
-         * Returns kubevirt node builder with supplied elb bridge name.
-         *
-         * @param elbBridgeName elb bridge name
-         * @return kubevirt node builder
-         */
-        KubevirtNode.Builder elbBridgeName(String elbBridgeName);
 
         /**
-         * Returns kubevirt node builder with supplied supplied elb Ip address.
+         * Returns kubevirt node builder with supplied supplied kubernetesExternalLbInterface.
          *
-         * @param elbIp elb ip address
+         * @param kubernetesExternalLbInterface kubernetesExternalLbInterface
          * @return kubevirt node builder
          */
-        KubevirtNode.Builder elbIp(IpAddress elbIp);
-
-        /**
-         * Returns kubevirt node builder with supplied supplied elb gw Ip address.
-         *
-         * @param elbGwIp elb gw ip address
-         * @return kubevirt node builder
-         */
-        KubevirtNode.Builder elbGwIp(IpAddress elbGwIp);
-
-        /**
-         * Returns kubevirt node builder with supplied supplied elb gw MAC address.
-         *
-         * @param elbGwMac elb gw mac address
-         * @return kubevirt node builder
-         */
-        KubevirtNode.Builder elbGwMac(MacAddress elbGwMac);
+        KubevirtNode.Builder kubernetesExternalLbInterface(KubernetesExternalLbInterface kubernetesExternalLbInterface);
     }
 }