use of io.fabric8.kubernetes.client.Watcher.Action in project kubernetes-client by fabric8io.
the class WatchIT method testWatchFailureHandling.
@Test
public void testWatchFailureHandling() throws InterruptedException {
String currentNamespace = session.getNamespace();
String name = "sample-configmap-watch";
Resource<ConfigMap> configMapClient = client.configMaps().inNamespace(currentNamespace).withName(name);
configMapClient.create(new ConfigMapBuilder().withNewMetadata().withName(name).endMetadata().build());
final CountDownLatch eventLatch = new CountDownLatch(1);
final CountDownLatch modifyLatch = new CountDownLatch(1);
final AtomicBoolean inMethod = new AtomicBoolean();
final CountDownLatch closeLatch = new CountDownLatch(1);
final AtomicBoolean concurrent = new AtomicBoolean();
Watch watch = configMapClient.watch(new Watcher<ConfigMap>() {
@Override
public void eventReceived(Action action, ConfigMap pod) {
eventLatch.countDown();
if (action.equals(Action.MODIFIED)) {
if (inMethod.getAndSet(true)) {
concurrent.set(true);
modifyLatch.countDown();
}
try {
// introduce a delay to cause the ping to terminate the connection
// if this doesn't work reliably, then an alternative would be to
// restart the apiserver
Thread.sleep(10000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new AssertionError(e);
}
modifyLatch.countDown();
inMethod.set(false);
}
}
@Override
public void onClose(WatcherException cause) {
}
@Override
public void onClose() {
closeLatch.countDown();
logger.info("watch closed...");
}
});
configMapClient.patch(PatchContext.of(PatchType.STRATEGIC_MERGE), new ConfigMapBuilder().withNewMetadata().addToLabels("foo", "bar").endMetadata().build());
configMapClient.patch(PatchContext.of(PatchType.STRATEGIC_MERGE), new ConfigMapBuilder().withNewMetadata().addToLabels("foo", "bar1").endMetadata().build());
assertTrue(eventLatch.await(10, TimeUnit.SECONDS));
assertTrue(modifyLatch.await(15, TimeUnit.SECONDS));
assertFalse(concurrent.get());
watch.close();
assertTrue(closeLatch.await(30, TimeUnit.SECONDS));
}
use of io.fabric8.kubernetes.client.Watcher.Action in project kubernetes-client by fabric8io.
the class CustomResourceTest method testWatchWithListOptions.
@Test
@DisplayName("Should be able to test watch with ListOptions provided")
void testWatchWithListOptions() throws IOException, InterruptedException {
// Given
server.expect().withPath("/apis/test.fabric8.io/v1alpha1/namespaces/ns1/hellos?resourceVersion=1003&timeoutSeconds=30&allowWatchBookmarks=true&watch=true").andUpgradeToWebSocket().open().waitFor(WATCH_EVENT_PERIOD).andEmit("{\"type\":\"ADDED\", \"object\":{\"kind\": \"Hello\", \"metadata\": {\"resourceVersion\": 1003}}}").done().always();
CountDownLatch anyEventReceived = new CountDownLatch(1);
// When
Watch watch = client.genericKubernetesResources(customResourceDefinitionContext).inNamespace("ns1").watch(new ListOptionsBuilder().withTimeoutSeconds(30L).withResourceVersion("1003").withAllowWatchBookmarks(true).build(), new Watcher<GenericKubernetesResource>() {
@Override
public void eventReceived(Action action, GenericKubernetesResource resource) {
anyEventReceived.countDown();
}
@Override
public void onClose(WatcherException cause) {
}
});
// Then
assertTrue(anyEventReceived.await(1, TimeUnit.SECONDS));
watch.close();
}
use of io.fabric8.kubernetes.client.Watcher.Action in project kubernetes-client by fabric8io.
the class CustomResourceTest method testWatchWithLabels.
@Test
@DisplayName("Should be able to watch with labelSelectors")
void testWatchWithLabels() throws IOException, InterruptedException {
// Given
server.expect().withPath("/apis/test.fabric8.io/v1alpha1/namespaces/ns1/hellos?labelSelector=" + Utils.toUrlEncoded("foo=bar") + "&allowWatchBookmarks=true&watch=true").andUpgradeToWebSocket().open().waitFor(WATCH_EVENT_PERIOD).andEmit("{\"type\":\"ADDED\", \"object\":{\"kind\": \"Hello\", \"metadata\": {\"resourceVersion\": 1}}}").done().always();
CountDownLatch anyEventReceived = new CountDownLatch(1);
// When
Watch watch = client.genericKubernetesResources(customResourceDefinitionContext).inNamespace("ns1").withLabel("foo", "bar").watch(new Watcher<GenericKubernetesResource>() {
@Override
public void eventReceived(Action action, GenericKubernetesResource resource) {
anyEventReceived.countDown();
}
@Override
public void onClose(WatcherException cause) {
}
});
// Then
assertTrue(anyEventReceived.await(1, TimeUnit.SECONDS));
watch.close();
}
use of io.fabric8.kubernetes.client.Watcher.Action in project kubernetes-client by fabric8io.
the class CustomResourceTest method testWatchAllResourceInNamespace.
@Test
@DisplayName("Should be able to watch some resource in a namespace")
void testWatchAllResourceInNamespace() throws IOException, InterruptedException {
// Given
server.expect().withPath("/apis/test.fabric8.io/v1alpha1/namespaces/ns1/hellos?allowWatchBookmarks=true&watch=true").andUpgradeToWebSocket().open().waitFor(WATCH_EVENT_PERIOD).andEmit("{\"type\":\"ADDED\", \"object\":{\"kind\": \"Hello\", \"metadata\": {\"resourceVersion\": 1}}}").done().always();
CountDownLatch anyEventReceived = new CountDownLatch(1);
// When
Watch watch = client.genericKubernetesResources(customResourceDefinitionContext).inNamespace("ns1").watch(new Watcher<GenericKubernetesResource>() {
@Override
public void eventReceived(Action action, GenericKubernetesResource resource) {
anyEventReceived.countDown();
}
@Override
public void onClose(WatcherException cause) {
}
});
// Then
assertTrue(anyEventReceived.await(1, TimeUnit.SECONDS));
watch.close();
}
use of io.fabric8.kubernetes.client.Watcher.Action in project kubernetes-client by fabric8io.
the class PodTest method testWatch.
@Test
void testWatch() throws InterruptedException {
// Given
// We start with a list
Pod pod1 = new PodBuilder().withNewMetadata().withName("pod1").withResourceVersion("1").endMetadata().build();
server.expect().withPath("/api/v1/namespaces/test/pods").andReturn(200, new PodListBuilder().withNewMetadata().withResourceVersion("1").endMetadata().addToItems(pod1).build()).once();
server.expect().withPath("/api/v1/namespaces/test/pods?fieldSelector=metadata.name%3Dpod1&allowWatchBookmarks=true&watch=true").andUpgradeToWebSocket().open().waitFor(50).andEmit(new WatchEvent(pod1, "DELETED")).done().always();
final CountDownLatch deleteLatch = new CountDownLatch(1);
final Watcher<Pod> watcher = new Watcher<Pod>() {
@Override
public void eventReceived(Action action, Pod resource) {
if (action != Action.DELETED) {
fail();
}
deleteLatch.countDown();
}
@Override
public void onClose(WatcherException cause) {
}
};
// When
final Watch watch = client.pods().withName("pod1").watch(watcher);
// Then
assertTrue(deleteLatch.await(30, TimeUnit.SECONDS));
watch.close();
}
Aggregations