What does the Action ADD in kubernetes-fabric8 watch API mean?
Yes, Fabric8 Kubernetes Client's WatchEvent
basically maps to Kubernetes pkg/watch/json
. So EventType
in it is basically a String
value which is sent by Kubernetes API server as a response and you need to handle what you need to do on the type of event. It can have these values: ADDED
, DELETED
, MODIFIED
, BOOKMARK
, ERROR
. When you start the watch without any resourceVersion
as a parameter, it would just start with resource version set to 0
. It starts watch from the beginning and you see ADD
actions being triggered for the resources which are already in the cluster. I think you must have seen this behavior when you use kubectl
as well:
~/go/src/github.com/fabric8io/kubernetes-client/kubernetes-model/kubernetes-model-core : $ kubectl get pods -wNAME READY STATUS RESTARTS AGE<These are pre existing resources listed since start of watch>nginx-deployment-54f57cf6bf-4swvr 1/1 Running 1 < 2d5hnginx-deployment-54f57cf6bf-4swvr-clonem6sg6 1/1 Running 1 2d5htestpod 1/1 Running 1 2d5htestpod-cloneb5fkz 1/1 Running 1 2d5h<You should be able to see events after you do some changes>testpod 1/1 Running 1 2d5h
If you go ahead and create some more resources, you should be able to see more ADDED
actions being triggered. On modifying, you should be seeing MODIFIED
events as well. These are sent by Kubernetes APIServer and Fabric8 Kubernetes Client just deserializes them into Java objects.
So, while watching I would suggest you to handle all the cases depending upon your situation inside the eventReceived()
call like this:
// Latch for Watch terminationfinal CountDownLatch isWatchClosed = new CountDownLatch(1);try (KubernetesClient client = new DefaultKubernetesClient()) { client.pods().inNamespace(namespace).watch(new Watcher<Pod>() { @Override public void eventReceived(Action action, Pod pod) { logger.log(Level.INFO, action.name() + " " + pod.getMetadata().getName()); switch (action.name()) { case "ADDED": logger.log(Level.INFO, pod.getMetadata().getName() + "got added"); break; case "DELETED": logger.log(Level.INFO, pod.getMetadata().getName() + "got deleted"); break; case "MODIFIED": logger.log(Level.INFO, pod.getMetadata().getName() + "got modified"); break; default: logger.log(Level.SEVERE, "Unrecognized event: " + action.name()); } } @Override public void onClose(KubernetesClientException e) { logger.log(Level.INFO, "Closed"); isWatchClosed.countDown(); } }); // Wait till watch gets closed isWatchClosed.await();} catch (InterruptedException interruptedException) { logger.log(Level.INFO, "Thread Interrupted!"); Thread.currentThread().interrupt();}
I hope this clears your understanding of Fabric8's WatchEvent types.