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