Просмотр исходного кода

Added function of deleting secret by name.Defined the error codes in K8sApiException about V1Secret Api.And modified the return values of the SecretApi.

马佳君 7 лет назад
Родитель
Сommit
7645e5d950

+ 37 - 7
src/main/java/nju/seec/SEECdemo/logic/api/k8s/SecretApi.java

@@ -3,6 +3,7 @@ package nju.seec.SEECdemo.logic.api.k8s;
 import com.google.protobuf.Api;
 import io.kubernetes.client.ApiException;
 import io.kubernetes.client.models.V1Secret;
+import nju.seec.SEECdemo.logic.api.k8s.exception.K8sApiException;
 import nju.seec.SEECdemo.logic.api.k8s.vo.ApiResult;
 
 import javax.xml.transform.Result;
@@ -12,38 +13,60 @@ import java.util.Map;
 public interface SecretApi {
 
     /**
-     * 创建通用密钥,如数据库的用户名,密码
+     * 创建通用密钥,如数据库的用户名,密码,默认type为Opaque
      * @param namespace
      * @param name
      * @param data
      * @return ApiResult
      */
-    ApiResult createGenericSecret(String namespace, String name, Map<String, byte[]> data);
+    V1Secret createGenericSecret(String namespace, String name, Map<String, byte[]> data) throws K8sApiException;
 
     /**
-     * 创建通用密钥,如数据库的用户名,密码
+     * 创建通用密钥,自己定义Secret的type,如Service Account、Opaque、kubernetes.io/dockerconfigjson.
      * @param namespace
      * @param name
      * @param data
      * @param type
      * @return ApiResult
      */
-    ApiResult createGenericSecret(String namespace, String name, Map<String, byte[]> data, String type);
+    V1Secret createGenericSecret(String namespace, String name, Map<String, byte[]> data, String type) throws K8sApiException;
 
     /**
      * 在namespace下生成私有仓库server的密钥
      * 密钥名称将自动生成
+     * @param namespace
+     * @param server
+     * @param user
+     * @param password
+     */
+    V1Secret createPrivateRegistrySecret(String namespace, String server, String user, String password) throws K8sApiException;
+
+
+    /**
+     * 在namespace下生成私有仓库server的密钥
+     * 密钥名称自己指定
+     * @param namespace
+     * @param name
      * @param server
      * @param user
      * @param password
      */
-    ApiResult createPrivateRegistrySecret(String namespace, String server, String user, String password);
+    V1Secret createPrivateRegistrySecret(String namespace, String name, String server, String user, String password) throws K8sApiException;
 
     /**
      * 获取指定namespace下的Secret列表
      * @param namespace
      */
-    ApiResult getSecretList(String namespace);
+    List<V1Secret> getSecretList(String namespace) throws K8sApiException;
+
+    /**
+     * 获取指定namespace下的指定type的Secret列表
+     *
+     * @param namespace
+     * @param type
+     */
+    List<V1Secret> getSecretListByType(String namespace, String type) throws K8sApiException;
+
 
     /**
      * 获取指定namespace下的密钥
@@ -51,6 +74,13 @@ public interface SecretApi {
      * @param namespace
      * @param name
      */
-    ApiResult getSecret(String namespace, String name);
+    V1Secret getSecretByName(String namespace, String name) throws K8sApiException;
+
+    /**
+     * 删除指定namespace下指定名字的Secret
+     * @param namespace
+     * @param name
+     */
+    void deleteSecretByName(String namespace, String name) throws K8sApiException;
 
 }

+ 2 - 0
src/main/java/nju/seec/SEECdemo/logic/api/k8s/exception/K8sApiException.java

@@ -18,7 +18,9 @@ public class K8sApiException extends Exception{
 
     public static final int NAMESPACE_NOT_EXIST = 400;
     public static final int DEPLOYMENT_NOT_EXIST = 401;
+    public static final int SECRET_NOT_FOUND = 404;
     public static final int RESOURCE_QUOTA_NOT_EXIST = 402;
+    public static final int SECRET_ALREADY_EXIST = 409;
 
     public static final int NAMESPACE_ALREADY_EXIST = 500;
 

+ 64 - 38
src/main/java/nju/seec/SEECdemo/logic/api/k8s/impl/SecretApiImpl.java

@@ -4,11 +4,10 @@ package nju.seec.SEECdemo.logic.api.k8s.impl;
 import com.google.protobuf.Api;
 import io.kubernetes.client.ApiException;
 import io.kubernetes.client.apis.CoreV1Api;
-import io.kubernetes.client.models.V1ObjectMeta;
-import io.kubernetes.client.models.V1Secret;
-import io.kubernetes.client.models.V1SecretList;
+import io.kubernetes.client.models.*;
 import nju.seec.SEECdemo.logic.api.k8s.DeploymentApi;
 import nju.seec.SEECdemo.logic.api.k8s.SecretApi;
+import nju.seec.SEECdemo.logic.api.k8s.exception.K8sApiException;
 import nju.seec.SEECdemo.logic.api.k8s.vo.ApiResult;
 import nju.seec.SEECdemo.util.LoggerUtil;
 import org.slf4j.Logger;
@@ -30,13 +29,13 @@ public class SecretApiImpl implements SecretApi {
     private CoreV1Api coreV1Api;
 
     @Override
-    public ApiResult createGenericSecret(String namespace, String name, Map<String, byte[]> data) {
+    public V1Secret createGenericSecret(String namespace, String name, Map<String, byte[]> data) throws K8sApiException {
         String type = "Opaque";
         return createGenericSecret(namespace, name, data, type);
     }
 
     @Override
-    public ApiResult createGenericSecret(String namespace, String name, Map<String, byte[]> data, String type) {
+    public V1Secret createGenericSecret(String namespace, String name, Map<String, byte[]> data, String type) throws K8sApiException {
 
         //Secret默认创建的Type为Opaque,base64编码格式的Secret,用来储存密码、密钥等。
 
@@ -51,20 +50,29 @@ public class SecretApiImpl implements SecretApi {
         v1Secret.setType(type);
 
         try {
-            V1Secret createdSecret = coreV1Api.createNamespacedSecret("mjj-test", v1Secret, "OK");
-            return new ApiResult<V1Secret>(createdSecret);
+            return coreV1Api.createNamespacedSecret("mjj-test", v1Secret, "OK");
         } catch (ApiException e) {
             LoggerUtil.error(logger, e, "Secret创建失败, Secret={}, response={}", v1Secret, e.getResponseBody());
-            ApiResult<Void> result = new ApiResult<>();
-            result.setSuccess(false);
-            result.setErrorCode(e.getCode());
-            return result;
+            if (e.getCode() == K8sApiException.NAMESPACE_NOT_EXIST) {
+                throw new K8sApiException(K8sApiException.NAMESPACE_NOT_EXIST);
+            } else if (e.getCode() == K8sApiException.SECRET_ALREADY_EXIST) {
+                throw new K8sApiException(K8sApiException.SECRET_ALREADY_EXIST);
+            }else{
+                throw new K8sApiException(K8sApiException.SYSTEM_ERROR);
+            }
         }
     }
 
     @Override
-    public ApiResult createPrivateRegistrySecret(String namespace, String server, String user, String password) {
+    public V1Secret createPrivateRegistrySecret(String namespace, String server, String user, String password) throws K8sApiException {
+        //dockerSecret 统一的名称
+        String name = "docker-registry-secret";
+        return createPrivateRegistrySecret(namespace, name, server, user, password);
 
+    }
+
+    @Override
+    public V1Secret createPrivateRegistrySecret(String namespace, String name, String server, String user, String password) throws K8sApiException {
         Map<String, byte[]> data = new HashMap<>();
 
         String dockerConfigJson =
@@ -74,46 +82,64 @@ public class SecretApiImpl implements SecretApi {
         data.put(".dockerconfigjson", dockerConfigJson.getBytes());
 
         //dockerSecret 统一的名称
-        String name = "docker-registry-secret";
-
-        String tpye = "kubernetes.io/dockerconfigjson";
 
-        return createGenericSecret(namespace, name, data, tpye);
+        String type = "kubernetes.io/dockerconfigjson";
 
+        return createGenericSecret(namespace, name, data, type);
     }
 
     @Override
-    public ApiResult getSecretList(String namespace) {
+    public List<V1Secret> getSecretList(String namespace) throws K8sApiException {
         try {
             V1SecretList v1SecretList = coreV1Api.listNamespacedSecret(namespace, "OK", "", "",false, "", 200, "", 10, false);
-            List<V1Secret> secretList = v1SecretList.getItems();
-            return new ApiResult<List<V1Secret>>(secretList);
+            return v1SecretList.getItems();
         } catch (ApiException e) {
             LoggerUtil.error(logger, e, "Secret列表获取失败, response={}", e.getResponseBody());
-            ApiResult<Void> result = new ApiResult<>();
-            result.setSuccess(false);
-            result.setErrorCode(e.getCode());
-            return result;
+            if (e.getCode() == K8sApiException.NAMESPACE_NOT_EXIST) {
+                throw new K8sApiException(K8sApiException.NAMESPACE_NOT_EXIST);
+            } else {
+                throw new K8sApiException(K8sApiException.SYSTEM_ERROR);
+            }
+        }
+    }
+
+    @Override
+    public List<V1Secret> getSecretListByType(String namespace, String type) throws K8sApiException {
+        List<V1Secret> secretList = getSecretList(namespace);
+        List<V1Secret> resultList = new ArrayList<>();
+        for (V1Secret secret : secretList) {
+            String secretType = secret.getType();
+            if (type.equals(secretType)) {
+                resultList.add(secret);
+            }
         }
+        return resultList;
     }
 
     @Override
-    public ApiResult getSecret(String namespace, String name) {
-        ApiResult apiResult = getSecretList(namespace);
-        if (apiResult.getErrorCode() != 0) {
-            return apiResult;
-        } else {
-            List<V1Secret> secretList = (List<V1Secret>) apiResult.getValue();
-            for (V1Secret secret : secretList) {
-                V1ObjectMeta meta = secret.getMetadata();
-                if (meta.getName().equals(name)) {
-                    return new ApiResult<V1Secret>(secret);
-                }
+    public V1Secret getSecretByName(String namespace, String name) throws K8sApiException {
+        List<V1Secret> secretList = getSecretList(namespace);
+        for (V1Secret secret : secretList) {
+            V1ObjectMeta meta = secret.getMetadata();
+            if (meta.getName().equals(name)) {
+                return secret;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void deleteSecretByName(String namespace, String name) throws K8sApiException {
+        V1DeleteOptions body = new V1DeleteOptions();
+        try {
+            //暂时没有用到deleteNamespacedSecret()中的其他参数。
+            V1Status v1Status = coreV1Api.deleteNamespacedSecret(name, namespace, body, "", 5, false, "");
+        } catch (ApiException e) {
+            if (e.getCode() == K8sApiException.SECRET_NOT_FOUND) {
+                throw new K8sApiException(K8sApiException.SECRET_NOT_FOUND);
+            } else {
+                throw new K8sApiException(K8sApiException.SYSTEM_ERROR);
             }
-            ApiResult<Void> result = new ApiResult<>();
-            result.setSuccess(false);
-            result.setErrorCode(ApiResult.NOT_EXIST);
-            return result;
         }
     }
 }