|
@@ -0,0 +1,177 @@
|
|
|
|
|
+package com.seecoder.client.k8s.impl;
|
|
|
|
|
+
|
|
|
|
|
+import com.google.gson.JsonSyntaxException;
|
|
|
|
|
+import com.seecoder.client.k8s.ConfigMapApi;
|
|
|
|
|
+import com.seecoder.client.k8s.exception.K8sApiException;
|
|
|
|
|
+import com.seecoder.client.k8s.model.ConfigMap;
|
|
|
|
|
+import com.seecoder.client.k8s.model.K8sObjectRequest;
|
|
|
|
|
+import com.seecoder.client.k8s.model.LabelSelector;
|
|
|
|
|
+import com.seecoder.util.LoggerUtil;
|
|
|
|
|
+import io.kubernetes.client.openapi.ApiException;
|
|
|
|
|
+import io.kubernetes.client.openapi.apis.CoreV1Api;
|
|
|
|
|
+import io.kubernetes.client.openapi.models.V1ConfigMap;
|
|
|
|
|
+import io.kubernetes.client.openapi.models.V1ConfigMapList;
|
|
|
|
|
+import io.kubernetes.client.openapi.models.V1DeleteOptions;
|
|
|
|
|
+import io.kubernetes.client.openapi.models.V1DeleteOptionsBuilder;
|
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
|
+
|
|
|
|
|
+import java.util.Collections;
|
|
|
|
|
+import java.util.List;
|
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
+
|
|
|
|
|
+import static com.seecoder.client.k8s.K8sConstants.FOREGROUND_PROPAGATION_POLICY;
|
|
|
|
|
+import static com.seecoder.client.k8s.K8sConstants.PRETTY_FORMAT;
|
|
|
|
|
+import static com.seecoder.client.k8s.exception.K8sApiException.ALREADY_EXIST;
|
|
|
|
|
+import static com.seecoder.client.k8s.exception.K8sApiException.NOT_FOUND;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@Service
|
|
|
|
|
+public class ConfigMapApiImpl implements ConfigMapApi {
|
|
|
|
|
+
|
|
|
|
|
+ private static final Logger logger = LoggerUtil.getLogger(ConfigMapApiImpl.class);
|
|
|
|
|
+
|
|
|
|
|
+ private CoreV1Api coreV1Api;
|
|
|
|
|
+
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ public ConfigMapApiImpl(CoreV1Api coreV1Api) {
|
|
|
|
|
+ this.coreV1Api = coreV1Api;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ConfigMap create(ConfigMap configMap) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ V1ConfigMap v1ConfigMap = configMap.toK8sObject();
|
|
|
|
|
+ V1ConfigMap result = coreV1Api.createNamespacedConfigMap(configMap.getNamespace(), v1ConfigMap, PRETTY_FORMAT, null, null);
|
|
|
|
|
+ return result == null ? null : new ConfigMap(result);
|
|
|
|
|
+ } catch (ApiException e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "configMap创建失败, configMap={}, response={}", configMap, e.getResponseBody());
|
|
|
|
|
+
|
|
|
|
|
+ if (e.getCode() == NOT_FOUND) {
|
|
|
|
|
+ throw new K8sApiException(NOT_FOUND, "namespace不存在");
|
|
|
|
|
+ } else if (e.getCode() == ALREADY_EXIST) {
|
|
|
|
|
+ throw new K8sApiException(ALREADY_EXIST, "configMap已经存在");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ throw K8sApiException.K8s_SYSTEM_ERROR_EXCEPTION;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "configMap创建异常, configMap={}", configMap);
|
|
|
|
|
+ throw e;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public ConfigMap update(ConfigMap configMap) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ V1ConfigMap v1ConfigMap = getV1ConfigMap(configMap.getNamespace(), configMap.getName());
|
|
|
|
|
+ configMap.merge(v1ConfigMap);
|
|
|
|
|
+ V1ConfigMap result = coreV1Api.replaceNamespacedConfigMap(configMap.getName(), configMap.getNamespace(), v1ConfigMap, PRETTY_FORMAT, null, null);
|
|
|
|
|
+ return result == null ? null : new ConfigMap(result);
|
|
|
|
|
+ } catch (ApiException e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "configMap更新失败, configMap={}, response={}", configMap, e.getResponseBody());
|
|
|
|
|
+
|
|
|
|
|
+ if (e.getCode() == NOT_FOUND) {
|
|
|
|
|
+ throw new K8sApiException(NOT_FOUND, "namespace不存在");
|
|
|
|
|
+ } else if (e.getCode() == ALREADY_EXIST) {
|
|
|
|
|
+ throw new K8sApiException(ALREADY_EXIST, "configMap已经存在");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ throw K8sApiException.K8s_SYSTEM_ERROR_EXCEPTION;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "configMap更新异常, configMap={}", configMap);
|
|
|
|
|
+ throw e;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void delete(ConfigMap configMap) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ V1DeleteOptions v1DeleteOptions = new V1DeleteOptionsBuilder()
|
|
|
|
|
+ .withApiVersion(ConfigMap.API_VERSION)
|
|
|
|
|
+ .withPropagationPolicy(FOREGROUND_PROPAGATION_POLICY)
|
|
|
|
|
+ .build();
|
|
|
|
|
+ coreV1Api.deleteNamespacedConfigMap(
|
|
|
|
|
+ configMap.getName(),
|
|
|
|
|
+ configMap.getNamespace(),
|
|
|
|
|
+ PRETTY_FORMAT,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null,
|
|
|
|
|
+ FOREGROUND_PROPAGATION_POLICY,
|
|
|
|
|
+ v1DeleteOptions);
|
|
|
|
|
+ } catch (ApiException e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "删除ConfigMap失败,namespace={}, name={}, response={}", configMap.getNamespace(), configMap.getName(), e.getResponseBody());
|
|
|
|
|
+
|
|
|
|
|
+ if (e.getCode() == K8sApiException.NOT_FOUND) {
|
|
|
|
|
+ return;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (JsonSyntaxException e) {
|
|
|
|
|
+ //do nothing
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "删除ConfigMap异常,namespace={}, name={}", configMap.getNamespace(), configMap.getName());
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public List<ConfigMap> getByCondition(K8sObjectRequest request) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ if (request.getName() != null) {
|
|
|
|
|
+ V1ConfigMap obj = coreV1Api.readNamespacedConfigMap(
|
|
|
|
|
+ request.getName(),
|
|
|
|
|
+ request.getNamespace(),
|
|
|
|
|
+ PRETTY_FORMAT,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null);
|
|
|
|
|
+ return obj == null ? Collections.emptyList() : Collections.singletonList(new ConfigMap(obj));
|
|
|
|
|
+ }
|
|
|
|
|
+ LabelSelector selector = null;
|
|
|
|
|
+ if (request.getSelector() != null) {
|
|
|
|
|
+ selector = request.getSelector();
|
|
|
|
|
+ }
|
|
|
|
|
+ if (request.getLabels() != null) {
|
|
|
|
|
+ if (selector == null) {
|
|
|
|
|
+ selector = new LabelSelector();
|
|
|
|
|
+ }
|
|
|
|
|
+ selector.addAll(request.getLabels());
|
|
|
|
|
+ }
|
|
|
|
|
+ logger.info(String.valueOf(selector.toJsonString()));
|
|
|
|
|
+ V1ConfigMapList objList = coreV1Api.listNamespacedConfigMap(
|
|
|
|
|
+ request.getNamespace(),
|
|
|
|
|
+ PRETTY_FORMAT,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null,
|
|
|
|
|
+ selector == null ? null : selector.toJsonString(),
|
|
|
|
|
+ null,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null,
|
|
|
|
|
+ null);
|
|
|
|
|
+ return objList.getItems().stream().map(ConfigMap::new).collect(Collectors.toList());
|
|
|
|
|
+ } catch (ApiException e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "查找configMap失败,namespace = {}, response={}",
|
|
|
|
|
+ request.getNamespace(), e.getResponseBody());
|
|
|
|
|
+ if (e.getCode() == NOT_FOUND) {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ LoggerUtil.error(logger, e, "查找configMap失败,namespace = {}, name={}",
|
|
|
|
|
+ request.getNamespace());
|
|
|
|
|
+ return Collections.emptyList();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private V1ConfigMap getV1ConfigMap(String namespace, String name) throws ApiException {
|
|
|
|
|
+ return coreV1Api.readNamespacedConfigMap(
|
|
|
|
|
+ name,
|
|
|
|
|
+ namespace,
|
|
|
|
|
+ PRETTY_FORMAT,
|
|
|
|
|
+ false,
|
|
|
|
|
+ false);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|