Refactor: remove some code duplication on k8s sync state

Change-Id: I39d07eb23287e68eb089d48be615d3fe99b6c728
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sSyncStateCommand.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sSyncStateCommand.java
index 41795aa..f9bc2c8 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sSyncStateCommand.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/cli/K8sSyncStateCommand.java
@@ -24,28 +24,21 @@
 import io.fabric8.kubernetes.client.KubernetesClient;
 import org.apache.karaf.shell.api.action.Command;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.k8snetworking.api.DefaultK8sPort;
 import org.onosproject.k8snetworking.api.K8sEndpointsAdminService;
 import org.onosproject.k8snetworking.api.K8sIngressAdminService;
 import org.onosproject.k8snetworking.api.K8sNamespaceAdminService;
 import org.onosproject.k8snetworking.api.K8sNetworkAdminService;
 import org.onosproject.k8snetworking.api.K8sNetworkPolicyAdminService;
 import org.onosproject.k8snetworking.api.K8sPodAdminService;
-import org.onosproject.k8snetworking.api.K8sPort;
 import org.onosproject.k8snetworking.api.K8sServiceAdminService;
 import org.onosproject.k8snetworking.util.K8sNetworkingUtil;
 import org.onosproject.k8snode.api.K8sApiConfig;
 import org.onosproject.k8snode.api.K8sApiConfigService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
 
 import java.util.List;
-import java.util.Map;
 
-import static org.onosproject.k8snetworking.api.K8sPort.State.INACTIVE;
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.syncPortFromPod;
 
 /**
  * Synchronizes kubernetes states.
@@ -62,13 +55,6 @@
     private static final String NETWORK_POLICY_FORMAT = "%-50s%-15s%-30s";
     private static final String NAMESPACE_FORMAT = "%-50s%-15s%-30s";
 
-    private static final String PORT_ID = "portId";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String PORT_NUMBER = "portNumber";
-    private static final String IP_ADDRESS = "ipAddress";
-    private static final String MAC_ADDRESS = "macAddress";
-    private static final String NETWORK_ID = "networkId";
-
     @Override
     protected void doExecute() {
         K8sApiConfigService configService = get(K8sApiConfigService.class);
@@ -240,36 +226,4 @@
                 policy.getSpec().getPolicyTypes().isEmpty() ?
                         "" : policy.getSpec().getPolicyTypes());
     }
-
-    private void syncPortFromPod(Pod pod, K8sNetworkAdminService adminService) {
-        Map<String, String> annotations = pod.getMetadata().getAnnotations();
-        if (annotations != null && !annotations.isEmpty() &&
-                annotations.get(PORT_ID) != null) {
-            String portId = annotations.get(PORT_ID);
-
-            K8sPort oldPort = adminService.port(portId);
-
-            String networkId = annotations.get(NETWORK_ID);
-            DeviceId deviceId = DeviceId.deviceId(annotations.get(DEVICE_ID));
-            PortNumber portNumber = PortNumber.portNumber(annotations.get(PORT_NUMBER));
-            IpAddress ipAddress = IpAddress.valueOf(annotations.get(IP_ADDRESS));
-            MacAddress macAddress = MacAddress.valueOf(annotations.get(MAC_ADDRESS));
-
-            K8sPort newPort = DefaultK8sPort.builder()
-                    .portId(portId)
-                    .networkId(networkId)
-                    .deviceId(deviceId)
-                    .ipAddress(ipAddress)
-                    .macAddress(macAddress)
-                    .portNumber(portNumber)
-                    .state(INACTIVE)
-                    .build();
-
-            if (oldPort == null) {
-                adminService.createPort(newPort);
-            } else {
-                adminService.updatePort(newPort);
-            }
-        }
-    }
 }
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
index 754efdf..d353cf3 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/util/K8sNetworkingUtil.java
@@ -30,17 +30,22 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.net.util.SubnetUtils;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onlab.packet.TpPort;
 import org.onosproject.cfg.ConfigProperty;
+import org.onosproject.k8snetworking.api.DefaultK8sPort;
 import org.onosproject.k8snetworking.api.K8sNamespaceService;
 import org.onosproject.k8snetworking.api.K8sNetwork;
+import org.onosproject.k8snetworking.api.K8sNetworkAdminService;
 import org.onosproject.k8snetworking.api.K8sNetworkService;
 import org.onosproject.k8snetworking.api.K8sPodService;
+import org.onosproject.k8snetworking.api.K8sPort;
 import org.onosproject.k8snetworking.api.K8sServiceService;
 import org.onosproject.k8snode.api.K8sApiConfig;
 import org.onosproject.k8snode.api.K8sApiConfigService;
 import org.onosproject.k8snode.api.K8sNode;
 import org.onosproject.k8snode.api.K8sNodeService;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.group.DefaultGroupKey;
 import org.onosproject.net.group.GroupKey;
@@ -58,6 +63,7 @@
 
 import static org.onosproject.k8snetworking.api.Constants.DEFAULT_NAMESPACE_HASH;
 import static org.onosproject.k8snetworking.api.Constants.PORT_NAME_PREFIX_CONTAINER;
+import static org.onosproject.k8snetworking.api.K8sPort.State.INACTIVE;
 
 /**
  * An utility that used in kubernetes networking app.
@@ -77,6 +83,13 @@
     private static final int MASK_RADIX = 2;
     private static final int PORT_RADIX = 16;
 
+    private static final String PORT_ID = "portId";
+    private static final String DEVICE_ID = "deviceId";
+    private static final String PORT_NUMBER = "portNumber";
+    private static final String IP_ADDRESS = "ipAddress";
+    private static final String MAC_ADDRESS = "macAddress";
+    private static final String NETWORK_ID = "networkId";
+
     private K8sNetworkingUtil() {
     }
 
@@ -490,6 +503,44 @@
         return 0;
     }
 
+    /**
+     * Synchronizes port from kubernetes POD.
+     *
+     * @param pod               kubernetes POD
+     * @param adminService      admin service
+     */
+    public static void syncPortFromPod(Pod pod, K8sNetworkAdminService adminService) {
+        Map<String, String> annotations = pod.getMetadata().getAnnotations();
+        if (annotations != null && !annotations.isEmpty() &&
+                annotations.get(PORT_ID) != null) {
+            String portId = annotations.get(PORT_ID);
+
+            K8sPort oldPort = adminService.port(portId);
+
+            String networkId = annotations.get(NETWORK_ID);
+            DeviceId deviceId = DeviceId.deviceId(annotations.get(DEVICE_ID));
+            PortNumber portNumber = PortNumber.portNumber(annotations.get(PORT_NUMBER));
+            IpAddress ipAddress = IpAddress.valueOf(annotations.get(IP_ADDRESS));
+            MacAddress macAddress = MacAddress.valueOf(annotations.get(MAC_ADDRESS));
+
+            K8sPort newPort = DefaultK8sPort.builder()
+                    .portId(portId)
+                    .networkId(networkId)
+                    .deviceId(deviceId)
+                    .ipAddress(ipAddress)
+                    .macAddress(macAddress)
+                    .portNumber(portNumber)
+                    .state(INACTIVE)
+                    .build();
+
+            if (oldPort == null) {
+                adminService.createPort(newPort);
+            } else {
+                adminService.updatePort(newPort);
+            }
+        }
+    }
+
     private static int binLower(String binStr, int bits) {
         StringBuilder outBin = new StringBuilder(
                 binStr.substring(MASK_BEGIN_IDX, MASK_MAX_IDX - bits));
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/web/K8sManagementWebResource.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/web/K8sManagementWebResource.java
index b6475e3..5cef329 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/web/K8sManagementWebResource.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/web/K8sManagementWebResource.java
@@ -15,19 +15,14 @@
  */
 package org.onosproject.k8snetworking.web;
 
-import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.client.KubernetesClient;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.MacAddress;
 import org.onlab.util.ItemNotFoundException;
-import org.onosproject.k8snetworking.api.DefaultK8sPort;
 import org.onosproject.k8snetworking.api.K8sEndpointsAdminService;
 import org.onosproject.k8snetworking.api.K8sIngressAdminService;
 import org.onosproject.k8snetworking.api.K8sNamespaceAdminService;
 import org.onosproject.k8snetworking.api.K8sNetworkAdminService;
 import org.onosproject.k8snetworking.api.K8sNetworkPolicyAdminService;
 import org.onosproject.k8snetworking.api.K8sPodAdminService;
-import org.onosproject.k8snetworking.api.K8sPort;
 import org.onosproject.k8snetworking.api.K8sServiceAdminService;
 import org.onosproject.k8snetworking.util.K8sNetworkingUtil;
 import org.onosproject.k8snode.api.K8sApiConfig;
@@ -35,8 +30,6 @@
 import org.onosproject.k8snode.api.K8sNode;
 import org.onosproject.k8snode.api.K8sNodeAdminService;
 import org.onosproject.k8snode.api.K8sNodeState;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
 import org.onosproject.rest.AbstractWebResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -46,10 +39,9 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import java.util.Map;
 
 import static java.lang.Thread.sleep;
-import static org.onosproject.k8snetworking.api.K8sPort.State.INACTIVE;
+import static org.onosproject.k8snetworking.util.K8sNetworkingUtil.syncPortFromPod;
 import static org.onosproject.k8snode.api.K8sNode.Type.MASTER;
 import static org.onosproject.k8snode.api.K8sNode.Type.MINION;
 import static org.onosproject.k8snode.api.K8sNodeState.COMPLETE;
@@ -61,13 +53,6 @@
 public class K8sManagementWebResource extends AbstractWebResource {
     private final Logger log = LoggerFactory.getLogger(getClass());
 
-    private static final String PORT_ID = "portId";
-    private static final String DEVICE_ID = "deviceId";
-    private static final String PORT_NUMBER = "portNumber";
-    private static final String IP_ADDRESS = "ipAddress";
-    private static final String MAC_ADDRESS = "macAddress";
-    private static final String NETWORK_ID = "networkId";
-
     private static final long SLEEP_MIDDLE_MS = 3000; // we wait 3s
     private static final long TIMEOUT_MS = 10000; // we wait 10s
 
@@ -177,38 +162,6 @@
         return ok(mapper().createObjectNode()).build();
     }
 
-    private void syncPortFromPod(Pod pod, K8sNetworkAdminService adminService) {
-        Map<String, String> annotations = pod.getMetadata().getAnnotations();
-        if (annotations != null && !annotations.isEmpty() &&
-                annotations.get(PORT_ID) != null) {
-            String portId = annotations.get(PORT_ID);
-
-            K8sPort oldPort = adminService.port(portId);
-
-            String networkId = annotations.get(NETWORK_ID);
-            DeviceId deviceId = DeviceId.deviceId(annotations.get(DEVICE_ID));
-            PortNumber portNumber = PortNumber.portNumber(annotations.get(PORT_NUMBER));
-            IpAddress ipAddress = IpAddress.valueOf(annotations.get(IP_ADDRESS));
-            MacAddress macAddress = MacAddress.valueOf(annotations.get(MAC_ADDRESS));
-
-            K8sPort newPort = DefaultK8sPort.builder()
-                    .portId(portId)
-                    .networkId(networkId)
-                    .deviceId(deviceId)
-                    .ipAddress(ipAddress)
-                    .macAddress(macAddress)
-                    .portNumber(portNumber)
-                    .state(INACTIVE)
-                    .build();
-
-            if (oldPort == null) {
-                adminService.createPort(newPort);
-            } else {
-                adminService.updatePort(newPort);
-            }
-        }
-    }
-
     private void syncRulesBase() {
         nodeAdminService.completeNodes(MASTER).forEach(this::syncRulesBaseForNode);
         nodeAdminService.completeNodes(MINION).forEach(this::syncRulesBaseForNode);