Add k8s POD events, trigger svc rule on receiving annotation event

Change-Id: I7fbbd071a9b078337c028791b7441603ae1e7473
diff --git a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java
index 138555b..65921dc 100644
--- a/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java
+++ b/apps/k8s-networking/app/src/main/java/org/onosproject/k8snetworking/impl/DistributedK8sPodStore.java
@@ -96,14 +96,23 @@
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static java.util.concurrent.Executors.newSingleThreadExecutor;
 import static org.onlab.util.Tools.groupedThreads;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_ANNOTATION_ADDED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_COMPLETED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_CRASH_LOOP_BACK_OFF;
 import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_CREATED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_FAILED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_PENDING;
 import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_REMOVED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_RUNNING;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_SUCCEEDED;
+import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_UNKNOWN;
 import static org.onosproject.k8snetworking.api.K8sPodEvent.Type.K8S_POD_UPDATED;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -121,6 +130,14 @@
     private static final String ERR_DUPLICATE = " already exists";
     private static final String APP_ID = "org.onosproject.k8snetwork";
 
+    private static final String PENDING = "Pending";
+    private static final String RUNNING = "Running";
+    private static final String SUCCEEDED = "Succeeded";
+    private static final String FAILED = "Failed";
+    private static final String UNKNOWN = "Unknown";
+    private static final String COMPLETED = "Completed";
+    private static final String CRASH_LOOP_BACK_OFF = "CrashLoopBackOff";
+
     private static final KryoNamespace
             SERIALIZER_K8S_POD = KryoNamespace.newBuilder()
             .register(KryoNamespaces.API)
@@ -275,9 +292,7 @@
                     break;
                 case UPDATE:
                     log.debug("Kubernetes pod updated {}", event.newValue());
-                    eventExecutor.execute(() ->
-                            notifyDelegate(new K8sPodEvent(
-                                    K8S_POD_UPDATED, event.newValue().value())));
+                    eventExecutor.execute(() -> processUpdate(event));
                     break;
                 case REMOVE:
                     log.debug("Kubernetes pod removed {}", event.oldValue());
@@ -290,5 +305,56 @@
                     break;
             }
         }
+
+        private void processUpdate(MapEvent<String, Pod> event) {
+            notifyDelegate(new K8sPodEvent(
+                    K8S_POD_UPDATED, event.newValue().value()));
+
+            String oldPhase = event.oldValue().value().getStatus().getPhase();
+            String newPhase = event.newValue().value().getStatus().getPhase();
+
+            if (!PENDING.equals(oldPhase) && PENDING.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_PENDING, event.newValue().value()));
+            }
+
+            if (!RUNNING.equals(oldPhase) && RUNNING.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_RUNNING, event.newValue().value()));
+            }
+
+            if (!SUCCEEDED.equals(oldPhase) && SUCCEEDED.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_SUCCEEDED, event.newValue().value()));
+            }
+
+            if (!FAILED.equals(oldPhase) && FAILED.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_FAILED, event.newValue().value()));
+            }
+
+            if (!UNKNOWN.equals(oldPhase) && UNKNOWN.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_UNKNOWN, event.newValue().value()));
+            }
+
+            if (!COMPLETED.equals(oldPhase) && COMPLETED.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_COMPLETED, event.newValue().value()));
+            }
+
+            if (!CRASH_LOOP_BACK_OFF.equals(oldPhase) && CRASH_LOOP_BACK_OFF.equals(newPhase)) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_CRASH_LOOP_BACK_OFF, event.newValue().value()));
+            }
+
+            Map<String, String> oldAnnot = event.oldValue().value().getMetadata().getAnnotations();
+            Map<String, String> newAnnot = event.newValue().value().getMetadata().getAnnotations();
+
+            if (oldAnnot == null && newAnnot != null) {
+                notifyDelegate(new K8sPodEvent(
+                        K8S_POD_ANNOTATION_ADDED, event.newValue().value()));
+            }
+        }
     }
 }