Pārlūkot izejas kodu

测试通过基本的创建应用的过程

raledong 7 gadi atpakaļ
vecāks
revīzija
22425cf123

+ 13 - 0
src/main/java/nju/seec/SEECdemo/logic/api/k8s/IngressApi.java

@@ -9,6 +9,10 @@ import nju.seec.SEECdemo.logic.api.k8s.vo.ApiResult;
  */
 public interface IngressApi {
 
+    /**
+     * 创建Ingress资源
+     * @param ingressDTO 不能为null,
+     */
     void create(IngressDTO ingressDTO);
 
     /**
@@ -26,4 +30,13 @@ public interface IngressApi {
      * @throws nju.seec.SEECdemo.logic.api.k8s.exception.K8sApiException 当K8s系统执行操作出现系统异常时,会抛出系统异常
      */
     void deleteIfExists(String namespace, String name);
+
+    /**
+     * 判断Ingress资源是否存在
+     * @param namespace
+     * @param name
+     * @return 存在返回true,否则返回false
+     * @throws nju.seec.SEECdemo.logic.api.k8s.exception.K8sApiException 会抛出系统异常
+     */
+    boolean exists(String namespace, String name);
 }

+ 7 - 2
src/main/java/nju/seec/SEECdemo/logic/api/k8s/dto/IngressDTO.java

@@ -3,6 +3,7 @@ package nju.seec.SEECdemo.logic.api.k8s.dto;
 import io.kubernetes.client.custom.IntOrString;
 import io.kubernetes.client.models.*;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
 import java.util.HashSet;
@@ -25,7 +26,8 @@ public class IngressDTO {
 
     private String name;
 
-    private String path;
+    //重定向的路径,默认为根路径
+    private String redirectPath = "/";
 
     private String httpHost;
 
@@ -35,6 +37,7 @@ public class IngressDTO {
 
     @Data
     @NoArgsConstructor
+    @EqualsAndHashCode
     public static class IngressDetailDTO{
 
         private String path;
@@ -42,6 +45,7 @@ public class IngressDTO {
         private String serviceName;
 
         private int port;
+
     }
 
 
@@ -62,7 +66,8 @@ public class IngressDTO {
         return new V1ObjectMetaBuilder()
                 .withName(name)
                 .withNamespace(namespace)
-                .addToAnnotations("nginx.ingress.kubernetes.io/rewrite-target", "/")
+                //@fixme ingress重定向的位置,目前默认为根路径,以后应当允许配置
+                .addToAnnotations("nginx.ingress.kubernetes.io/rewrite-target", redirectPath)
                 .build();
     }
 

+ 11 - 0
src/main/java/nju/seec/SEECdemo/logic/api/k8s/impl/IngressApiImpl.java

@@ -90,4 +90,15 @@ public class IngressApiImpl implements IngressApi{
             //K8s Swagger 异常, 无需进行处理
         }
     }
+
+    /**
+     * @see IngressApi#exists(String, String)
+     * @param namespace
+     * @param name
+     * @return
+     */
+    @Override
+    public boolean exists(String namespace, String name) {
+        return false;
+    }
 }

+ 23 - 0
src/main/java/nju/seec/SEECdemo/logic/api/k8s/vo/Ingress.java

@@ -0,0 +1,23 @@
+package nju.seec.SEECdemo.logic.api.k8s.vo;
+
+import io.kubernetes.client.models.V1beta1Ingress;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * author: rale
+ * createdAt: 1/5/19
+ */
+@Data
+@NoArgsConstructor
+public class Ingress {
+
+    private String name;
+
+    private String namespace;
+
+    public Ingress(V1beta1Ingress v1beta1Ingress) {
+        this.name = v1beta1Ingress.getMetadata().getName();
+        this.namespace = v1beta1Ingress.getMetadata().getNamespace();
+    }
+}

+ 58 - 16
src/main/java/nju/seec/SEECdemo/logic/service/impl/ApplicationServiceImpl.java

@@ -1,17 +1,18 @@
 package nju.seec.SEECdemo.logic.service.impl;
 
-import nju.seec.SEECdemo.logic.api.k8s.DeploymentApi;
-import nju.seec.SEECdemo.logic.api.k8s.NamespaceApi;
-import nju.seec.SEECdemo.logic.api.k8s.SecretApi;
-import nju.seec.SEECdemo.logic.api.k8s.ServiceApi;
+import nju.seec.SEECdemo.logic.api.k8s.*;
 import nju.seec.SEECdemo.logic.api.k8s.dto.DeploymentDTO;
+import nju.seec.SEECdemo.logic.api.k8s.dto.IngressDTO;
 import nju.seec.SEECdemo.logic.api.k8s.dto.ServiceDTO;
+import nju.seec.SEECdemo.logic.api.k8s.exception.K8sApiException;
 import nju.seec.SEECdemo.logic.api.k8s.util.SecretTypeEnum;
 import nju.seec.SEECdemo.logic.api.k8s.vo.SecretVO;
 import nju.seec.SEECdemo.logic.service.ApplicationService;
 import nju.seec.SEECdemo.logic.vo.ApplicationVO;
 import nju.seec.SEECdemo.util.LoggerUtil;
 import nju.seec.SEECdemo.web.dto.ApplicationDTO;
+import nju.seec.SEECdemo.web.dto.ContainerDTO;
+import nju.seec.SEECdemo.web.dto.PortDTO;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -36,6 +37,9 @@ public class ApplicationServiceImpl implements ApplicationService{
     @Autowired
     private SecretApi secretApi;
 
+    @Autowired
+    private IngressApi ingressApi;
+
     @Override
     public ApplicationVO create(ApplicationDTO applicationDTO) {
         return null;
@@ -60,21 +64,22 @@ public class ApplicationServiceImpl implements ApplicationService{
     public void deploy(ApplicationDTO applicationDTO) {
         String projectName = applicationDTO.getProjectName();
         if (namespaceApi.exists(projectName)) {
-            //判断deployment是否存在 存在则删除
-            //判断service是否存在,存在则删除
+            try {
+                DeploymentDTO deploymentDTO = buildDeploymentDTO(applicationDTO);
+                LoggerUtil.info(logger, "deploymentDTO={}", deploymentDTO);
+                deploymentApi.createSync(deploymentDTO);
 
-            DeploymentDTO deploymentDTO = buildDeploymentDTO(applicationDTO);
-            LoggerUtil.info(logger, "deploymentDTO={}", deploymentDTO);
-            deploymentApi.createSync(deploymentDTO);
+                //判断service是否存在
+                ServiceDTO serviceDTO = buildServiceDTO(applicationDTO);
+                serviceApi.create(serviceDTO);
 
-            //判断service是否存在
-            ServiceDTO serviceDTO = buildServiceDTO(applicationDTO);
-            serviceApi.create(serviceDTO);
+                IngressDTO ingressDTO = buildIngressDTO(applicationDTO);
+                ingressApi.create(ingressDTO);
+            } catch (K8sApiException e) {
 
+            }
         }
 
-
-
     }
 
     private DeploymentDTO buildDeploymentDTO(ApplicationDTO applicationDTO) {
@@ -82,8 +87,12 @@ public class ApplicationServiceImpl implements ApplicationService{
 
         //将registry密钥作为imagePullSecrets注入
         List<String> registrySecrets = secretApi
-                .getSecretListByType(applicationDTO.getProjectName(), SecretTypeEnum.REGISTRY)
-                .stream().map(SecretVO::getName).collect(Collectors.toList()
+                .getSecretListByType(
+                        applicationDTO.getProjectName(),
+                        SecretTypeEnum.REGISTRY)
+                .stream()
+                .map(SecretVO::getName)
+                .collect(Collectors.toList()
         );
         deploymentDTO.setImagePullSecrets(registrySecrets);
 
@@ -99,4 +108,37 @@ public class ApplicationServiceImpl implements ApplicationService{
     private ServiceDTO buildServiceDTO(ApplicationDTO applicationDTO) {
         return applicationDTO.toServiceDTO();
     }
+
+    //@todo 构建Ingress
+    //@fixme 潜在bug 如果容器上的IP和Service上的IP并非一一对应,根据容器的IP暴露Service会出现映射错误
+    private IngressDTO buildIngressDTO(ApplicationDTO applicationDTO) {
+        String appName = applicationDTO.getName();
+        String projectName = applicationDTO.getProjectName();
+
+        IngressDTO ingressDTO = new IngressDTO();
+        ingressDTO.setName(appName);
+        ingressDTO.setNamespace(projectName);
+        ingressDTO.setHttpHost("deernowl.cn");
+
+        //@todo lambda表达式解决
+        Set<IngressDTO.IngressDetailDTO> detailDTOS = new HashSet<>();
+        for (ContainerDTO containerDTO : applicationDTO.getContainers()) {
+            String containerName = containerDTO.getName();
+
+            Set<IngressDTO.IngressDetailDTO> ingressDetailDTOS = containerDTO.getPorts()
+                    .stream()
+                    .filter(PortDTO::isExpose)
+                    .map(portDTO ->{
+                        IngressDTO.IngressDetailDTO ingressDetailDTO = new IngressDTO.IngressDetailDTO();
+                        ingressDetailDTO.setServiceName(applicationDTO.getName());
+                        ingressDetailDTO.setPort(portDTO.getPort());
+                        ingressDetailDTO.setPath("/" + appName + "/" + containerName);
+                        return ingressDetailDTO;
+                    })
+                    .collect(Collectors.toSet());
+            detailDTOS.addAll(ingressDetailDTOS);
+        }
+        ingressDTO.setHttpRules(detailDTOS);
+        return ingressDTO;
+    }
 }

+ 5 - 4
src/main/java/nju/seec/SEECdemo/logic/vo/ApplicationVO.java

@@ -3,6 +3,7 @@ package nju.seec.SEECdemo.logic.vo;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -10,11 +11,11 @@ import java.util.Map;
 @EqualsAndHashCode
 public class ApplicationVO {
 
-
-    private long id;
-
-    private long projectId;
+    private String projectName;
 
     private String name;
 
+    //传递回额外的信息
+    private Map<String, Object> extra = new HashMap<>();
+
 }

+ 2 - 0
src/main/java/nju/seec/SEECdemo/web/dto/PortDTO.java

@@ -2,6 +2,7 @@ package nju.seec.SEECdemo.web.dto;
 
 import lombok.Data;
 import nju.seec.SEECdemo.logic.api.k8s.dto.ContainerPortDTO;
+import nju.seec.SEECdemo.logic.api.k8s.dto.IngressDTO;
 import nju.seec.SEECdemo.logic.api.k8s.dto.ServicePortDTO;
 import org.hibernate.validator.constraints.Range;
 
@@ -49,4 +50,5 @@ public class PortDTO {
         servicePortDTO.setTargetPort(port);
         return servicePortDTO;
     }
+
 }