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;