All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alogic.kube.KubeHandler Maven / Gradle / Ivy

package com.alogic.kube;

import com.alogic.kube.api.ListParams;
import com.alogic.kube.builder.ControllerBuilder;
import com.alogic.kube.informer.SharedInformerFactory;
import com.alogic.kube.reconciler.CommonObjectReconciler;
import com.alogic.load.Loadable;
import io.kubernetes.client.common.KubernetesListObject;
import io.kubernetes.client.common.KubernetesObject;
import io.kubernetes.client.extended.controller.Controller;
import io.kubernetes.client.extended.controller.ControllerWatch;
import io.kubernetes.client.extended.controller.reconciler.Request;
import io.kubernetes.client.extended.workqueue.WorkQueue;
import io.kubernetes.client.informer.ResourceEventHandler;
import io.kubernetes.client.informer.SharedIndexInformer;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.util.CallGenerator;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
import com.anysoft.util.*;

import java.util.Map;
import java.util.Objects;

/**
 * k8s的事件处理器
 */
public abstract class KubeHandler
        extends Loadable.Abstract
        implements ResourceEventHandler,
        XMLConfigurable, Configurable, Loadable {
    /**
     * a logger of slf4j
     */
    protected static final Logger LOG =
            LoggerFactory.getLogger(KubeHandler.class);

    protected String id;
    protected int worker = 1;
    protected ListParams listParams = new ListParams();

    public boolean isOk(){
        return StringUtils.isNotEmpty(id);
    }

    @Override
    public String getId() {
        return id;
    }


    @Override
    public void report(Element xml) {
        if (xml != null){
            XmlTools.setString(xml,"id",getId());
            XmlTools.setString(xml,"module",getClass().getName());
        }
    }

    @Override
    public void report(Map json) {
        if (json != null){
            JsonTools.setString(json,"id",getId());
            JsonTools.setString(json,"module",getClass().getName());
        }
    }

    @Override
    public void configure(Properties p) {
        id = PropertiesConstants.getString(p,"id",getClass().getName());
        worker = PropertiesConstants.getInt(p,"worker",worker);
        listParams.configure(p);
    }

    @Override
    public void configure(Element e, Properties p) {
        XmlElementProperties xmlElementProperties = new XmlElementProperties(e,p);
        configure(xmlElementProperties);
    }

    protected ControllerWatch apply(WorkQueue workQueue) {
        return ControllerBuilder.controllerWatchBuilder(getObjClass(), workQueue)
                .withWorkQueueKeyFunc(obj -> new Request(Objects.requireNonNull(obj.getMetadata()).getName()))
                .withOnAddFilter(newObj -> true)
                .withOnUpdateFilter((oldObj, newObj) -> false)
                .withOnDeleteFilter((obj, stateUnknown) -> true)
                .build();
    }

    abstract protected CallGenerator buildCall(ApiClient apiClient);

    abstract protected Class getObjClass();

    abstract protected Class getListObjClass();

    public Controller build(SharedInformerFactory informerFactory, ApiClient apiClient){
        SharedIndexInformer nodeInformer = informerFactory.sharedIndexInformerFor(getId(),
                        buildCall(apiClient),getObjClass(),getListObjClass());
        nodeInformer.addEventHandler(this);
        return
                ControllerBuilder.defaultBuilder(informerFactory)
                        .watch(getId(),this::apply)
                        .withReconciler(new CommonObjectReconciler())
                        .withName(id)
                        .withWorkerCount(worker)
                        .withReadyFunc(nodeInformer::hasSynced)
                        .build();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy