Move kubevirt sync rules endpoint from network to node package

Change-Id: Iaaedeba57c18ae49d90cc5a8d913b17596be38fa
(cherry picked from commit 82c2fdf0827127234a0af0e8892dcd93f4f17073)
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtManagementWebResource.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtManagementWebResource.java
deleted file mode 100644
index 043899f..0000000
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtManagementWebResource.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2021-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.kubevirtnetworking.web;
-
-import org.onosproject.kubevirtnode.api.KubevirtNode;
-import org.onosproject.kubevirtnode.api.KubevirtNodeAdminService;
-import org.onosproject.rest.AbstractWebResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import static java.lang.Thread.sleep;
-import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.WORKER;
-import static org.onosproject.kubevirtnode.api.KubevirtNodeState.COMPLETE;
-import static org.onosproject.kubevirtnode.api.KubevirtNodeState.INIT;
-
-/**
- * REST interface for synchronizing kubevirt network states and rules.
- */
-@Path("management")
-public class KubevirtManagementWebResource extends AbstractWebResource {
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    private static final long SLEEP_MS = 5000; // we wait 5s for init each node
-    private static final long TIMEOUT_MS = 10000; // we wait 10s
-
-    /**
-     * Synchronizes the flow rules.
-     *
-     * @return 200 OK with sync result, 404 not found
-     */
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    @Path("sync/rules")
-    public Response syncRules() {
-
-        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
-
-        service.completeNodes(WORKER).forEach(this::syncRulesBase);
-        return ok(mapper().createObjectNode()).build();
-    }
-
-    private void syncRulesBase(KubevirtNode node) {
-        KubevirtNode updated = node.updateState(INIT);
-        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
-        service.updateNode(updated);
-
-        boolean result = true;
-        long timeoutExpiredMs = System.currentTimeMillis() + TIMEOUT_MS;
-
-        while (service.node(node.hostname()).state() != COMPLETE) {
-
-            long  waitMs = timeoutExpiredMs - System.currentTimeMillis();
-
-            try {
-                sleep(SLEEP_MS);
-            } catch (InterruptedException e) {
-                log.error("Exception caused during node synchronization...");
-            }
-
-            if (service.node(node.hostname()).state() == COMPLETE) {
-                break;
-            } else {
-                service.updateNode(updated);
-                log.info("Failed to synchronize flow rules, retrying...");
-            }
-
-            if (waitMs <= 0) {
-                result = false;
-                break;
-            }
-        }
-
-        if (result) {
-            log.info("Successfully synchronize flow rules for node {}!", node.hostname());
-        } else {
-            log.warn("Failed to synchronize flow rules for node {}.", node.hostname());
-        }
-    }
-}
diff --git a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
index 45dcdae..1345f95 100644
--- a/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
+++ b/apps/kubevirt-networking/app/src/main/java/org/onosproject/kubevirtnetworking/web/KubevirtNetworkingWebApplication.java
@@ -27,7 +27,6 @@
     public Set<Class<?>> getClasses() {
         return getClasses(
                 KubevirtNetworkWebResource.class,
-                KubevirtManagementWebResource.class,
                 KubevirtRouterWebResource.class,
                 KubevirtFloatingIpsWebResource.class,
                 KubevirtSecurityGroupWebResource.class,
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
index c28bc94..b18f42d 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/web/KubevirtNodeWebResource.java
@@ -43,9 +43,13 @@
 import java.util.Set;
 
 import static com.fasterxml.jackson.databind.SerializationFeature.INDENT_OUTPUT;
+import static java.lang.Thread.sleep;
 import static javax.ws.rs.core.Response.created;
 import static org.onlab.util.Tools.nullIsIllegal;
 import static org.onlab.util.Tools.readTreeFromStream;
+import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.WORKER;
+import static org.onosproject.kubevirtnode.api.KubevirtNodeState.COMPLETE;
+import static org.onosproject.kubevirtnode.api.KubevirtNodeState.INIT;
 
 /**
  * Handles REST API call of KubeVirt node config.
@@ -62,11 +66,13 @@
     private static final String NODE_ID = "NODE_ID";
     private static final String REMOVE = "REMOVE";
     private static final String QUERY = "QUERY";
-    private static final String INIT = "INIT";
     private static final String NOT_EXIST = "Not exist";
     private static final String STATE = "State";
     private static final String RESULT = "Result";
 
+    private static final long SLEEP_MS = 5000; // we wait 5s for init each node
+    private static final long TIMEOUT_MS = 10000; // we wait 10s
+
     private static final String HOST_NAME = "hostname";
     private static final String ERROR_MESSAGE = " cannot be null";
 
@@ -197,7 +203,7 @@
             log.error("Given node {} does not exist", hostname);
             return Response.serverError().build();
         }
-        KubevirtNode updated = node.updateState(KubevirtNodeState.INIT);
+        KubevirtNode updated = node.updateState(INIT);
         service.updateNode(updated);
         return ok(mapper().createObjectNode()).build();
     }
@@ -217,7 +223,7 @@
 
         service.nodes()
                 .forEach(n -> {
-                    KubevirtNode updated = n.updateState(KubevirtNodeState.INIT);
+                    KubevirtNode updated = n.updateState(INIT);
                     service.updateNode(updated);
                 });
 
@@ -239,13 +245,67 @@
         service.nodes().stream()
                 .filter(n -> n.state() != KubevirtNodeState.COMPLETE)
                 .forEach(n -> {
-                    KubevirtNode updated = n.updateState(KubevirtNodeState.INIT);
+                    KubevirtNode updated = n.updateState(INIT);
                     service.updateNode(updated);
                 });
 
         return ok(mapper().createObjectNode()).build();
     }
 
+    /**
+     * Synchronizes the flow rules.
+     *
+     * @return 200 OK with sync result, 404 not found
+     */
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("sync/rules")
+    public Response syncRules() {
+
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+
+        service.completeNodes(WORKER).forEach(this::syncRulesBase);
+        return ok(mapper().createObjectNode()).build();
+    }
+
+    private void syncRulesBase(KubevirtNode node) {
+        KubevirtNode updated = node.updateState(INIT);
+        KubevirtNodeAdminService service = get(KubevirtNodeAdminService.class);
+        service.updateNode(updated);
+
+        boolean result = true;
+        long timeoutExpiredMs = System.currentTimeMillis() + TIMEOUT_MS;
+
+        while (service.node(node.hostname()).state() != COMPLETE) {
+
+            long  waitMs = timeoutExpiredMs - System.currentTimeMillis();
+
+            try {
+                sleep(SLEEP_MS);
+            } catch (InterruptedException e) {
+                log.error("Exception caused during node synchronization...");
+            }
+
+            if (service.node(node.hostname()).state() == COMPLETE) {
+                break;
+            } else {
+                service.updateNode(updated);
+                log.info("Failed to synchronize flow rules, retrying...");
+            }
+
+            if (waitMs <= 0) {
+                result = false;
+                break;
+            }
+        }
+
+        if (result) {
+            log.info("Successfully synchronize flow rules for node {}!", node.hostname());
+        } else {
+            log.warn("Failed to synchronize flow rules for node {}.", node.hostname());
+        }
+    }
+
     private Set<KubevirtNode> readNodeConfiguration(InputStream input) {
         Set<KubevirtNode> nodeSet = Sets.newHashSet();
         try {