Learn the devId where VM attached by listening VMI event

Refactor: extract wait logic into a common utility class

Change-Id: I96d60832770ee919a7632cd2665c82eb6f96bfba
(cherry picked from commit 0b90d45879020aab3a5fa2bac6a5b19b6bbe75a6)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSecurityGroupHandler.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSecurityGroupHandler.java
index 09cc288..d97ac47 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSecurityGroupHandler.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/impl/KubevirtSecurityGroupHandler.java
@@ -78,7 +78,6 @@
 import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
-import static java.lang.Thread.sleep;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
 import static org.onosproject.kubevirtnetworking.api.Constants.ACL_CT_TABLE;
@@ -103,6 +102,7 @@
 import static org.onosproject.kubevirtnetworking.impl.OsgiPropertyConstants.USE_SECURITY_GROUP;
 import static org.onosproject.kubevirtnetworking.impl.OsgiPropertyConstants.USE_SECURITY_GROUP_DEFAULT;
 import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.getPropertyValueAsBoolean;
+import static org.onosproject.kubevirtnetworking.util.KubevirtNetworkingUtil.waitFor;
 import static org.onosproject.kubevirtnetworking.util.RulePopulatorUtil.buildPortRangeMatches;
 import static org.onosproject.kubevirtnetworking.util.RulePopulatorUtil.computeCtMaskFlag;
 import static org.onosproject.kubevirtnetworking.util.RulePopulatorUtil.computeCtStateFlag;
@@ -154,8 +154,6 @@
     private static final int ACTION_NONE = 0;
     private static final int ACTION_DROP = -1;
 
-    private static final long SLEEP_MS = 5000;
-
     /** Apply EdgeStack security group rule for VM traffic. */
     private boolean useSecurityGroup = USE_SECURITY_GROUP_DEFAULT;
 
@@ -388,11 +386,7 @@
             if (deviceService.getDevice(deviceId) != null) {
                 break;
             } else {
-                try {
-                    sleep(SLEEP_MS);
-                } catch (InterruptedException e) {
-                    log.error("Failed to install security group default rules.");
-                }
+                waitFor(5);
             }
         }
 
@@ -1020,11 +1014,7 @@
                 // now we wait 5s for all tenant bridges are created,
                 // FIXME: we need to fina a better way to wait all tenant bridges
                 // are created before installing default security group rules
-                try {
-                    sleep(SLEEP_MS);
-                } catch (InterruptedException e) {
-                    log.error("Failed to install security group default rules.");
-                }
+                waitFor(5);
 
                 for (KubevirtNode node : nodes) {
                     initializeTenantPipeline(network, node, true);
@@ -1108,11 +1098,7 @@
             }
 
             // FIXME: we wait all port get its deviceId updated
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Failed to install security group default rules.");
-            }
+            waitFor(5);
 
             resetSecurityGroupRulesByNode(node);
         }