Search in sources :

Example 6 with SharedInformerFactory

use of io.kubernetes.client.informer.SharedInformerFactory in project java by kubernetes-client.

the class DefaultSharedIndexInformerWireMockTest method testAllNamespacedPodInformerTransformFailure.

@Test
public void testAllNamespacedPodInformerTransformFailure() throws InterruptedException {
    CoreV1Api coreV1Api = new CoreV1Api(client);
    String startRV = "1000";
    String endRV = "1001";
    V1PodList podList = new V1PodList().metadata(new V1ListMeta().resourceVersion(startRV)).items(Arrays.asList());
    stubFor(get(urlPathEqualTo("/api/v1/pods")).withQueryParam("watch", equalTo("false")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json").withBody(new JSON().serialize(podList))));
    Watch.Response<V1Pod> watchResponse = new Watch.Response<>(EventType.ADDED.name(), new V1Pod().metadata(new V1ObjectMeta().namespace(namespace).name(podName).resourceVersion(endRV)));
    stubFor(get(urlPathEqualTo("/api/v1/pods")).withQueryParam("watch", equalTo("true")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json").withBody(new JSON().serialize(watchResponse))));
    SharedInformerFactory factory = new SharedInformerFactory();
    SharedIndexInformer<V1Pod> podInformer = factory.sharedIndexInformerFor((CallGeneratorParams params) -> {
        try {
            return coreV1Api.listPodForAllNamespacesCall(null, null, null, null, null, null, params.resourceVersion, null, params.timeoutSeconds, params.watch, null);
        } catch (ApiException e) {
            throw new RuntimeException(e);
        }
    }, V1Pod.class, V1PodList.class);
    podInformer.setTransform((obj) -> {
        throw new ObjectTransformException("test transform failure");
    });
    AtomicBoolean foundExistingPod = new AtomicBoolean(false);
    podInformer.addEventHandler(new ResourceEventHandler<V1Pod>() {

        @Override
        public void onAdd(V1Pod obj) {
            if (podName.equals(obj.getMetadata().getName()) && namespace.equals(obj.getMetadata().getNamespace())) {
                foundExistingPod.set(true);
            }
        }

        @Override
        public void onUpdate(V1Pod oldObj, V1Pod newObj) {
        }

        @Override
        public void onDelete(V1Pod obj, boolean deletedFinalStateUnknown) {
        }
    });
    factory.startAllRegisteredInformers();
    Thread.sleep(1000);
    // cannot find the pod due to transform failure
    assertFalse(foundExistingPod.get());
    assertEquals(endRV, podInformer.lastSyncResourceVersion());
    verify(1, getRequestedFor(urlPathEqualTo("/api/v1/pods")).withQueryParam("watch", equalTo("false")));
    verify(moreThan(1), getRequestedFor(urlPathEqualTo("/api/v1/pods")).withQueryParam("watch", equalTo("true")));
    factory.stopAllRegisteredInformers();
}
Also used : V1ObjectMeta(io.kubernetes.client.openapi.models.V1ObjectMeta) ObjectTransformException(io.kubernetes.client.informer.exception.ObjectTransformException) JSON(io.kubernetes.client.openapi.JSON) CallGeneratorParams(io.kubernetes.client.util.CallGeneratorParams) V1ListMeta(io.kubernetes.client.openapi.models.V1ListMeta) V1PodList(io.kubernetes.client.openapi.models.V1PodList) WireMock.aResponse(com.github.tomakehurst.wiremock.client.WireMock.aResponse) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) SharedInformerFactory(io.kubernetes.client.informer.SharedInformerFactory) Watch(io.kubernetes.client.util.Watch) V1Pod(io.kubernetes.client.openapi.models.V1Pod) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api) ApiException(io.kubernetes.client.openapi.ApiException) Test(org.junit.Test)

Example 7 with SharedInformerFactory

use of io.kubernetes.client.informer.SharedInformerFactory in project java by kubernetes-client.

the class DefaultSharedIndexInformerWireMockTest method testNamespacedPodInformerNormalBehavior.

@Test
public void testNamespacedPodInformerNormalBehavior() throws InterruptedException {
    CoreV1Api coreV1Api = new CoreV1Api(client);
    String startRV = "1000";
    String endRV = "1001";
    V1PodList podList = new V1PodList().metadata(new V1ListMeta().resourceVersion(startRV)).items(Arrays.asList());
    stubFor(get(urlPathEqualTo("/api/v1/namespaces/" + namespace + "/pods")).withQueryParam("watch", equalTo("false")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json").withBody(new JSON().serialize(podList))));
    Watch.Response<V1Pod> watchResponse = new Watch.Response<>(EventType.ADDED.name(), new V1Pod().metadata(new V1ObjectMeta().namespace(namespace).name(podName).resourceVersion(endRV)));
    stubFor(get(urlPathEqualTo("/api/v1/namespaces/" + namespace + "/pods")).withQueryParam("watch", equalTo("true")).willReturn(aResponse().withStatus(200).withHeader("Content-Type", "application/json").withBody(new JSON().serialize(watchResponse))));
    SharedInformerFactory factory = new SharedInformerFactory();
    SharedIndexInformer<V1Pod> podInformer = factory.sharedIndexInformerFor((CallGeneratorParams params) -> {
        try {
            return coreV1Api.listNamespacedPodCall(namespace, null, null, null, null, null, null, params.resourceVersion, null, params.timeoutSeconds, params.watch, null);
        } catch (ApiException e) {
            throw new RuntimeException(e);
        }
    }, V1Pod.class, V1PodList.class);
    AtomicBoolean foundExistingPod = new AtomicBoolean(false);
    podInformer.addEventHandler(new ResourceEventHandler<V1Pod>() {

        @Override
        public void onAdd(V1Pod obj) {
            if (podName.equals(obj.getMetadata().getName()) && namespace.equals(obj.getMetadata().getNamespace())) {
                foundExistingPod.set(true);
            }
        }

        @Override
        public void onUpdate(V1Pod oldObj, V1Pod newObj) {
        }

        @Override
        public void onDelete(V1Pod obj, boolean deletedFinalStateUnknown) {
        }
    });
    factory.startAllRegisteredInformers();
    Thread.sleep(1000);
    assertEquals(true, foundExistingPod.get());
    assertEquals(endRV, podInformer.lastSyncResourceVersion());
    verify(1, getRequestedFor(urlPathEqualTo("/api/v1/namespaces/" + namespace + "/pods")).withQueryParam("watch", equalTo("false")));
    verify(moreThan(1), getRequestedFor(urlPathEqualTo("/api/v1/namespaces/" + namespace + "/pods")).withQueryParam("watch", equalTo("true")));
    factory.stopAllRegisteredInformers();
}
Also used : V1ObjectMeta(io.kubernetes.client.openapi.models.V1ObjectMeta) JSON(io.kubernetes.client.openapi.JSON) CallGeneratorParams(io.kubernetes.client.util.CallGeneratorParams) V1ListMeta(io.kubernetes.client.openapi.models.V1ListMeta) V1PodList(io.kubernetes.client.openapi.models.V1PodList) WireMock.aResponse(com.github.tomakehurst.wiremock.client.WireMock.aResponse) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) SharedInformerFactory(io.kubernetes.client.informer.SharedInformerFactory) Watch(io.kubernetes.client.util.Watch) V1Pod(io.kubernetes.client.openapi.models.V1Pod) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api) ApiException(io.kubernetes.client.openapi.ApiException) Test(org.junit.Test)

Example 8 with SharedInformerFactory

use of io.kubernetes.client.informer.SharedInformerFactory in project java by kubernetes-client.

the class DefaultSharedIndexInformerWireMockTest method testInformerReListingOnListForbidden.

@Test
public void testInformerReListingOnListForbidden() throws InterruptedException {
    CoreV1Api coreV1Api = new CoreV1Api(client);
    stubFor(get(urlPathEqualTo("/api/v1/namespaces/" + namespace + "/pods")).withQueryParam("watch", equalTo("false")).willReturn(aResponse().withStatus(403).withHeader("Content-Type", "application/json").withBody(new JSON().serialize(new V1Status().apiVersion("v1").kind("Status").code(403).reason("RBAC forbidden")))));
    SharedInformerFactory factory = new SharedInformerFactory();
    SharedIndexInformer<V1Pod> podInformer = factory.sharedIndexInformerFor((CallGeneratorParams params) -> {
        try {
            return coreV1Api.listNamespacedPodCall(namespace, null, null, null, null, null, null, params.resourceVersion, null, params.timeoutSeconds, params.watch, null);
        } catch (ApiException e) {
            throw new RuntimeException(e);
        }
    }, V1Pod.class, V1PodList.class);
    factory.startAllRegisteredInformers();
    // Sleep mroe than 1s so that informer can perform multiple rounds of list-watch
    Thread.sleep(3000);
    verify(moreThan(1), getRequestedFor(urlPathEqualTo("/api/v1/namespaces/" + namespace + "/pods")).withQueryParam("watch", equalTo("false")));
    factory.stopAllRegisteredInformers();
}
Also used : V1Status(io.kubernetes.client.openapi.models.V1Status) SharedInformerFactory(io.kubernetes.client.informer.SharedInformerFactory) V1Pod(io.kubernetes.client.openapi.models.V1Pod) JSON(io.kubernetes.client.openapi.JSON) CallGeneratorParams(io.kubernetes.client.util.CallGeneratorParams) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api) ApiException(io.kubernetes.client.openapi.ApiException) Test(org.junit.Test)

Example 9 with SharedInformerFactory

use of io.kubernetes.client.informer.SharedInformerFactory in project java by kubernetes-client.

the class ControllerExample method main.

public static void main(String[] args) throws IOException {
    CoreV1Api coreV1Api = new CoreV1Api();
    ApiClient apiClient = coreV1Api.getApiClient();
    OkHttpClient httpClient = apiClient.getHttpClient().newBuilder().readTimeout(0, TimeUnit.SECONDS).build();
    apiClient.setHttpClient(httpClient);
    // instantiating an informer-factory, and there should be only one informer-factory
    // globally.
    SharedInformerFactory informerFactory = new SharedInformerFactory();
    // registering node-informer into the informer-factory.
    SharedIndexInformer<V1Node> nodeInformer = informerFactory.sharedIndexInformerFor((CallGeneratorParams params) -> {
        return coreV1Api.listNodeCall(null, null, null, null, null, null, params.resourceVersion, null, params.timeoutSeconds, params.watch, null);
    }, V1Node.class, V1NodeList.class);
    informerFactory.startAllRegisteredInformers();
    EventBroadcaster eventBroadcaster = new LegacyEventBroadcaster(coreV1Api);
    // nodeReconciler prints node information on events
    NodePrintingReconciler nodeReconciler = new NodePrintingReconciler(nodeInformer, eventBroadcaster.newRecorder(new V1EventSource().host("localhost").component("node-printer")));
    // Use builder library to construct a default controller.
    Controller controller = ControllerBuilder.defaultBuilder(informerFactory).watch((workQueue) -> ControllerBuilder.controllerWatchBuilder(V1Node.class, workQueue).withWorkQueueKeyFunc((V1Node node) -> new Request(node.getMetadata().getName())).withOnAddFilter((V1Node createdNode) -> createdNode.getMetadata().getName().startsWith(// optional, set onAdd filter
    "docker-")).withOnUpdateFilter((V1Node oldNode, V1Node newNode) -> newNode.getMetadata().getName().startsWith(// optional, set onUpdate filter
    "docker-")).withOnDeleteFilter((V1Node deletedNode, Boolean stateUnknown) -> deletedNode.getMetadata().getName().startsWith(// optional, set onDelete filter
    "docker-")).build()).withReconciler(// required, set the actual reconciler
    nodeReconciler).withName(// optional, set name for controller
    "node-printing-controller").withWorkerCount(// optional, set worker thread count
    4).withReadyFunc(// optional, only starts controller when the
    nodeInformer::hasSynced).build();
    // Use builder library to manage one or multiple controllers.
    ControllerManager controllerManager = ControllerBuilder.controllerManagerBuilder(informerFactory).addController(controller).build();
    LeaderElectingController leaderElectingController = new LeaderElectingController(new LeaderElector(new LeaderElectionConfig(new EndpointsLock("kube-system", "leader-election", "foo"), Duration.ofMillis(10000), Duration.ofMillis(8000), Duration.ofMillis(5000))), controllerManager);
    leaderElectingController.run();
}
Also used : EventBroadcaster(io.kubernetes.client.extended.event.legacy.EventBroadcaster) LegacyEventBroadcaster(io.kubernetes.client.extended.event.legacy.LegacyEventBroadcaster) V1NodeList(io.kubernetes.client.openapi.models.V1NodeList) LeaderElector(io.kubernetes.client.extended.leaderelection.LeaderElector) Result(io.kubernetes.client.extended.controller.reconciler.Result) LeaderElectionConfig(io.kubernetes.client.extended.leaderelection.LeaderElectionConfig) V1Node(io.kubernetes.client.openapi.models.V1Node) Reconciler(io.kubernetes.client.extended.controller.reconciler.Reconciler) SharedInformerFactory(io.kubernetes.client.informer.SharedInformerFactory) ApiClient(io.kubernetes.client.openapi.ApiClient) Request(io.kubernetes.client.extended.controller.reconciler.Request) Lister(io.kubernetes.client.informer.cache.Lister) ControllerManager(io.kubernetes.client.extended.controller.ControllerManager) SharedIndexInformer(io.kubernetes.client.informer.SharedIndexInformer) Duration(java.time.Duration) EventRecorder(io.kubernetes.client.extended.event.legacy.EventRecorder) EventBroadcaster(io.kubernetes.client.extended.event.legacy.EventBroadcaster) LeaderElectingController(io.kubernetes.client.extended.controller.LeaderElectingController) EventType(io.kubernetes.client.extended.event.EventType) EndpointsLock(io.kubernetes.client.extended.leaderelection.resourcelock.EndpointsLock) Controller(io.kubernetes.client.extended.controller.Controller) ControllerBuilder(io.kubernetes.client.extended.controller.builder.ControllerBuilder) V1EventSource(io.kubernetes.client.openapi.models.V1EventSource) IOException(java.io.IOException) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api) TimeUnit(java.util.concurrent.TimeUnit) OkHttpClient(okhttp3.OkHttpClient) LegacyEventBroadcaster(io.kubernetes.client.extended.event.legacy.LegacyEventBroadcaster) CallGeneratorParams(io.kubernetes.client.util.CallGeneratorParams) OkHttpClient(okhttp3.OkHttpClient) V1Node(io.kubernetes.client.openapi.models.V1Node) Request(io.kubernetes.client.extended.controller.reconciler.Request) ControllerManager(io.kubernetes.client.extended.controller.ControllerManager) ApiClient(io.kubernetes.client.openapi.ApiClient) LeaderElectingController(io.kubernetes.client.extended.controller.LeaderElectingController) Controller(io.kubernetes.client.extended.controller.Controller) CallGeneratorParams(io.kubernetes.client.util.CallGeneratorParams) LeaderElectingController(io.kubernetes.client.extended.controller.LeaderElectingController) LeaderElectionConfig(io.kubernetes.client.extended.leaderelection.LeaderElectionConfig) SharedInformerFactory(io.kubernetes.client.informer.SharedInformerFactory) EndpointsLock(io.kubernetes.client.extended.leaderelection.resourcelock.EndpointsLock) V1EventSource(io.kubernetes.client.openapi.models.V1EventSource) LeaderElector(io.kubernetes.client.extended.leaderelection.LeaderElector) LegacyEventBroadcaster(io.kubernetes.client.extended.event.legacy.LegacyEventBroadcaster) CoreV1Api(io.kubernetes.client.openapi.apis.CoreV1Api)

Example 10 with SharedInformerFactory

use of io.kubernetes.client.informer.SharedInformerFactory in project java by kubernetes-client.

the class KubernetesInformerFactoryProcessor method informer.

@SuppressWarnings({ "unchecked", "rawtypes" })
private <T extends KubernetesObject> SharedInformer<T> informer(Class<T> type, KubernetesInformer kubernetesInformer) {
    ApiClient apiClient = this.beanFactory.getBean(ApiClient.class);
    if (apiClient.getHttpClient().readTimeoutMillis() > 0) {
        log.warn("Enforcing read-timeout of the ApiClient {} to {} so that the watch connection won't abort from client-side", apiClient, informerProperties.getClientReadTimeout());
        apiClient.setHttpClient(apiClient.getHttpClient().newBuilder().readTimeout(informerProperties.getClientReadTimeout()).build());
    }
    SharedInformerFactory sharedInformerFactory = this.beanFactory.getBean(SharedInformerFactory.class);
    final GenericKubernetesApi api = new GenericKubernetesApi(kubernetesInformer.apiTypeClass(), kubernetesInformer.apiListTypeClass(), kubernetesInformer.groupVersionResource().apiGroup(), kubernetesInformer.groupVersionResource().apiVersion(), kubernetesInformer.groupVersionResource().resourcePlural(), apiClient);
    SharedIndexInformer<T> sharedIndexInformer = sharedInformerFactory.sharedIndexInformerFor(api, type, kubernetesInformer.resyncPeriodMillis(), kubernetesInformer.namespace());
    return sharedIndexInformer;
}
Also used : SharedInformerFactory(io.kubernetes.client.informer.SharedInformerFactory) GenericKubernetesApi(io.kubernetes.client.util.generic.GenericKubernetesApi) ApiClient(io.kubernetes.client.openapi.ApiClient)

Aggregations

SharedInformerFactory (io.kubernetes.client.informer.SharedInformerFactory)10 CoreV1Api (io.kubernetes.client.openapi.apis.CoreV1Api)7 CallGeneratorParams (io.kubernetes.client.util.CallGeneratorParams)7 Test (org.junit.Test)6 ApiException (io.kubernetes.client.openapi.ApiException)5 JSON (io.kubernetes.client.openapi.JSON)5 V1Pod (io.kubernetes.client.openapi.models.V1Pod)5 WireMock.aResponse (com.github.tomakehurst.wiremock.client.WireMock.aResponse)4 V1ListMeta (io.kubernetes.client.openapi.models.V1ListMeta)4 V1ObjectMeta (io.kubernetes.client.openapi.models.V1ObjectMeta)4 V1PodList (io.kubernetes.client.openapi.models.V1PodList)4 Watch (io.kubernetes.client.util.Watch)4 ApiClient (io.kubernetes.client.openapi.ApiClient)3 Controller (io.kubernetes.client.extended.controller.Controller)2 ControllerBuilder (io.kubernetes.client.extended.controller.builder.ControllerBuilder)2 Reconciler (io.kubernetes.client.extended.controller.reconciler.Reconciler)2 Request (io.kubernetes.client.extended.controller.reconciler.Request)2 Lister (io.kubernetes.client.informer.cache.Lister)2 V1Node (io.kubernetes.client.openapi.models.V1Node)2 V1Status (io.kubernetes.client.openapi.models.V1Status)2