Fix: ensure to install rules while waiting for patch port creation

Change-Id: I0a7aa8ebd34a85bed6b8feb3ade5551b36be18cf
(cherry picked from commit c59f83c4dc333357680d22ca731f10340fab24b7)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
index 241b3c5..d4a90a5 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtNetworkHandler.java
@@ -504,21 +504,20 @@
         MacAddress routerMacAddress = getRouterMacAddress(router);
 
         if (routerMacAddress == null) {
-            log.warn("Setting gateway default eggress rule to gateway for tenant internal network because " +
-                    "there's no br-int port for device {}", gwDeviceId);
+            log.warn("Setting gateway default egress rule to gateway for tenant " +
+                "internal network because there's no br-int port for device {}", gwDeviceId);
             return;
         }
 
         KubevirtNode gwNode = kubevirtNodeService.node(gwDeviceId);
 
         if (gwNode == null) {
-            log.warn("Setting gateway default eggress rule to gateway for tenant internal network because " +
-                    "there's no gateway node for device {}", gwDeviceId);
+            log.warn("Setting gateway default egress rule to gateway for tenant " +
+                "internal network because there's no gateway node for device {}", gwDeviceId);
             return;
         }
 
-
-        PortNumber patchPortNumber = tunnelToTenantPort(workerNode, network);
+        PortNumber patchPortNumber = tunnelToTenantPort(deviceService, workerNode, network);
         if (patchPortNumber == null) {
             return;
         }
@@ -608,7 +607,7 @@
             return;
         }
 
-        PortNumber tunToIntPortNum = portNumber(gwNode.tunBridge(), TUNNEL_TO_INTEGRATION);
+        PortNumber tunToIntPortNum = portNumber(deviceService, gwNode.tunBridge(), TUNNEL_TO_INTEGRATION);
 
         TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                 .matchTunnelId(Long.parseLong(network.segmentId()));
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java
index 3967d6a..3d0045d 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSwitchingTenantHandler.java
@@ -152,14 +152,17 @@
         for (KubevirtNode localNode : kubevirtNodeService.completeNodes(WORKER)) {
 
             while (true) {
-                if (tunnelToTenantPort(localNode, network) != null) {
+                KubevirtNode updatedNode = kubevirtNodeService.node(localNode.hostname());
+                if (tunnelToTenantPort(deviceService, updatedNode, network) != null) {
                     break;
                 } else {
+                    log.info("Waiting for tunnel to tenant patch port creation " +
+                             "on ingress rule setup on node {}", updatedNode);
                     waitFor(3);
                 }
             }
 
-            PortNumber patchPortNumber = tunnelToTenantPort(localNode, network);
+            PortNumber patchPortNumber = tunnelToTenantPort(deviceService, localNode, network);
 
             TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                     .matchTunnelId(Long.parseLong(network.segmentId()));
@@ -182,11 +185,24 @@
 
     private void setIngressRules(KubevirtNode node, boolean install) {
         for (KubevirtNetwork network : kubevirtNetworkService.tenantNetworks()) {
-            PortNumber patchPortNumber = tunnelToTenantPort(node, network);
-            if (patchPortNumber == null) {
+
+            if (node == null || node.type() != WORKER) {
                 return;
             }
 
+            while (true) {
+                KubevirtNode updatedNode = kubevirtNodeService.node(node.hostname());
+                if (tunnelToTenantPort(deviceService, updatedNode, network) != null) {
+                    break;
+                } else {
+                    log.info("Waiting for tunnel to tenant patch port creation " +
+                             "on ingress rule setup on node {}", updatedNode);
+                    waitFor(3);
+                }
+            }
+
+            PortNumber patchPortNumber = tunnelToTenantPort(deviceService, node, network);
+
             TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder()
                     .matchTunnelId(Long.parseLong(network.segmentId()));
 
@@ -236,11 +252,19 @@
                 continue;
             }
 
-            PortNumber patchPortNumber = tunnelToTenantPort(remoteNode, network);
-            if (patchPortNumber == null) {
-                return;
+            while (true) {
+                KubevirtNode updatedNode = kubevirtNodeService.node(localNode.hostname());
+                if (tunnelToTenantPort(deviceService, updatedNode, network) != null) {
+                    break;
+                } else {
+                    log.info("Waiting for tunnel to tenant patch port creation " +
+                             "on egress rule setup on node {}", updatedNode);
+                    waitFor(3);
+                }
             }
 
+            PortNumber patchPortNumber = tunnelToTenantPort(deviceService, remoteNode, network);
+
             PortNumber tunnelPortNumber = tunnelPort(remoteNode, network);
             if (tunnelPortNumber == null) {
                 return;
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
index 89ff8b2..21353b9 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/util/KubevirtNetworkingUtil.java
@@ -27,7 +27,6 @@
 import org.apache.commons.net.util.SubnetUtils;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.onlab.osgi.DefaultServiceDirectory;
 import org.onlab.packet.ARP;
 import org.onlab.packet.Ethernet;
 import org.onlab.packet.Ip4Address;
@@ -405,11 +404,13 @@
     /**
      * Obtains the tunnel bridge to tenant bridge patch port number.
      *
+     * @param deviceService device service
      * @param node    kubevirt node
      * @param network kubevirt network
      * @return patch port number
      */
-    public static PortNumber tunnelToTenantPort(KubevirtNode node, KubevirtNetwork network) {
+    public static PortNumber tunnelToTenantPort(DeviceService deviceService,
+                             KubevirtNode node, KubevirtNetwork network) {
         if (network.segmentId() == null) {
             return null;
         }
@@ -419,7 +420,7 @@
         }
 
         String tunToTenantPortName = TUNNEL_TO_TENANT_PREFIX + segmentIdHex(network.segmentId());
-        return portNumber(node.tunBridge(), tunToTenantPortName);
+        return portNumber(deviceService, node.tunBridge(), tunToTenantPortName);
     }
 
     /**
@@ -463,8 +464,7 @@
         return "";
     }
 
-    public static PortNumber portNumber(DeviceId deviceId, String portName) {
-        DeviceService deviceService = DefaultServiceDirectory.getService(DeviceService.class);
+    public static PortNumber portNumber(DeviceService deviceService, DeviceId deviceId, String portName) {
         Port port = deviceService.getPorts(deviceId).stream()
                 .filter(p -> p.isEnabled() &&
                         Objects.equals(p.annotations().value(PORT_NAME), portName))