Support to learn external gateway MAC at controller

Change-Id: I72c13133708de1ac86e26160397233518489d46b
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
index 7be1e9a5..87e1f1d 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
@@ -60,6 +60,7 @@
     private final IpAddress managementIp;
     private final IpAddress dataIp;
     private final K8sNodeState state;
+    private final MacAddress extGatewayMac;
 
     private static final String NOT_NULL_MSG = "Node % cannot be null";
 
@@ -75,10 +76,12 @@
      * @param managementIp      management IP address
      * @param dataIp            data IP address
      * @param state             node state
+     * @param extGatewayMac     external gateway MAC address
      */
     protected DefaultK8sNode(String hostname, Type type, DeviceId intgBridge,
                              DeviceId extBridge, IpAddress managementIp,
-                             IpAddress dataIp, K8sNodeState state) {
+                             IpAddress dataIp, K8sNodeState state,
+                             MacAddress extGatewayMac) {
         this.hostname = hostname;
         this.type = type;
         this.intgBridge = intgBridge;
@@ -86,6 +89,7 @@
         this.managementIp = managementIp;
         this.dataIp = dataIp;
         this.state = state;
+        this.extGatewayMac = extGatewayMac;
     }
 
     @Override
@@ -123,6 +127,7 @@
                 .managementIp(managementIp)
                 .dataIp(dataIp)
                 .state(state)
+                .extGatewayMac(extGatewayMac)
                 .build();
     }
 
@@ -136,6 +141,7 @@
                 .managementIp(managementIp)
                 .dataIp(dataIp)
                 .state(state)
+                .extGatewayMac(extGatewayMac)
                 .build();
     }
 
@@ -163,10 +169,25 @@
                 .managementIp(managementIp)
                 .dataIp(dataIp)
                 .state(newState)
+                .extGatewayMac(extGatewayMac)
                 .build();
     }
 
     @Override
+    public K8sNode updateExtGatewayMac(MacAddress newMac) {
+        return new Builder()
+                .hostname(hostname)
+                .type(type)
+                .intgBridge(intgBridge)
+                .managementIp(managementIp)
+                .dataIp(dataIp)
+                .state(state)
+                .extGatewayMac(newMac)
+                .build();
+
+    }
+
+    @Override
     public PortNumber grePortNum() {
         return tunnelPortNum(GRE_TUNNEL);
     }
@@ -245,15 +266,7 @@
 
     @Override
     public MacAddress extGatewayMac() {
-        OvsdbClientService client = getOvsClient();
-
-        if (client == null) {
-            return null;
-        }
-
-        Interface iface = getOvsClient().getInterface(EXTERNAL_BRIDGE);
-        OvsdbMap data = (OvsdbMap) iface.getExternalIdsColumn().data();
-        return MacAddress.valueOf((String) data.map().get(EXT_GW_MAC));
+        return extGatewayMac;
     }
 
     @Override
@@ -308,7 +321,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(hostname, type, intgBridge, extBridge,
-                            managementIp, dataIp, state);
+                            managementIp, dataIp, state, extGatewayMac);
     }
 
     @Override
@@ -321,6 +334,7 @@
                 .add("managementIp", managementIp)
                 .add("dataIp", dataIp)
                 .add("state", state)
+                .add("extGatewayMac", extGatewayMac)
                 .toString();
     }
 
@@ -376,7 +390,8 @@
                 .extBridge(node.extBridge())
                 .managementIp(node.managementIp())
                 .dataIp(node.dataIp())
-                .state(node.state());
+                .state(node.state())
+                .extGatewayMac(node.extGatewayMac());
     }
 
     public static final class Builder implements K8sNode.Builder {
@@ -389,6 +404,7 @@
         private IpAddress dataIp;
         private K8sNodeState state;
         private K8sApiConfig apiConfig;
+        private MacAddress extGatewayMac;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -407,7 +423,8 @@
                     extBridge,
                     managementIp,
                     dataIp,
-                    state);
+                    state,
+                    extGatewayMac);
         }
 
         @Override
@@ -451,5 +468,11 @@
             this.state = state;
             return this;
         }
+
+        @Override
+        public Builder extGatewayMac(MacAddress extGatewayMac) {
+            this.extGatewayMac = extGatewayMac;
+            return this;
+        }
     }
 }
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
index 30449ff..065f2dd 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
@@ -121,6 +121,14 @@
     K8sNode updateState(K8sNodeState newState);
 
     /**
+     * Returns new kubernetes node instance with given external gateway MAC address.
+     *
+     * @param macAddress updated MAC address
+     * @return updated kubernetes node
+     */
+    K8sNode updateExtGatewayMac(MacAddress macAddress);
+
+    /**
      * Returns the GRE tunnel port number.
      *
      * @return GRE port number; null if the GRE tunnel port does not exist
@@ -271,5 +279,13 @@
          * @return kubernetes node builder
          */
         Builder state(K8sNodeState state);
+
+        /**
+         * Returns kubernetes node builder with supplied external gateway MAC.
+         *
+         * @param extGatewayMac external gateway MAC address
+         * @return kubernetes node builder
+         */
+        Builder extGatewayMac(MacAddress extGatewayMac);
     }
 }