Not add node into the cluster if it is tainted with kubevirt.io key

Change-Id: I22a87c33fbb506a12cc851d9bbba6bde25d7ded4
(cherry picked from commit 552314f8e0c66bc94d2e1070fbb3ca4ac2f841e7)
diff --git a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
index f4aac55..45cb87a 100644
--- a/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
+++ b/apps/kubevirt-node/api/src/main/java/org/onosproject/kubevirtnode/api/KubevirtNode.java
@@ -45,6 +45,11 @@
          * Signifies that this is a gateway which is running on master node.
          */
         GATEWAY,
+
+        /**
+         * Signifies that this is a unmanaged node.
+         */
+        OTHER,
     }
 
     /**
diff --git a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
index 839695f..96c71d9 100644
--- a/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
+++ b/apps/kubevirt-node/app/src/main/java/org/onosproject/kubevirtnode/util/KubevirtNodeUtil.java
@@ -21,6 +21,8 @@
 import com.google.common.base.Strings;
 import io.fabric8.kubernetes.api.model.Node;
 import io.fabric8.kubernetes.api.model.NodeAddress;
+import io.fabric8.kubernetes.api.model.NodeSpec;
+import io.fabric8.kubernetes.api.model.Taint;
 import io.fabric8.kubernetes.client.ConfigBuilder;
 import io.fabric8.kubernetes.client.DefaultKubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClient;
@@ -60,6 +62,7 @@
 import static org.onosproject.kubevirtnode.api.Constants.SONA_PROJECT_DOMAIN;
 import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.GATEWAY;
 import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.MASTER;
+import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.OTHER;
 import static org.onosproject.kubevirtnode.api.KubevirtNode.Type.WORKER;
 
 /**
@@ -85,7 +88,10 @@
     private static final String INTERFACE_KEY = "interface";
 
     private static final int PORT_NAME_MAX_LENGTH = 15;
-    private static final int DNS_DEFAULT_PORT = 53;
+
+    private static final String NO_SCHEDULE_EFFECT = "NoSchedule";
+    private static final String KUBEVIRT_IO_KEY = "kubevirt.io/drain";
+    private static final String DRAINING_VALUE = "draining";
 
     /**
      * Prevents object installation from external.
@@ -379,6 +385,23 @@
             log.error("Failed to parse physnet config or gateway config object", e);
         }
 
+        // if the node is taint with kubevirt.io key configured,
+        // we mark this node as OTHER type, and do not add it into the cluster
+        NodeSpec spec = node.getSpec();
+        if (spec.getTaints() != null) {
+            for (Taint taint : spec.getTaints()) {
+                String effect = taint.getEffect();
+                String key = taint.getKey();
+                String value = taint.getValue();
+
+                if (StringUtils.equals(effect, NO_SCHEDULE_EFFECT) &&
+                    StringUtils.equals(key, KUBEVIRT_IO_KEY) &&
+                    StringUtils.equals(value, DRAINING_VALUE)) {
+                    nodeType = OTHER;
+                }
+            }
+        }
+
         return DefaultKubevirtNode.builder()
                 .hostname(hostname)
                 .managementIp(managementIp)