Bladeren bron

优化应用编排的分页获取、修改、复制等接口

reghao 6 jaren geleden
bovenliggende
commit
23be7d64f9
29 gewijzigde bestanden met toevoegingen van 463 en 243 verwijderingen
  1. 2 0
      common/src/main/java/cn/reghao/autodop/common/deploy/AppStatus.java
  2. 5 4
      common/src/main/java/cn/reghao/autodop/common/dockerc/DockerClient.java
  3. 1 2
      common/src/main/java/cn/reghao/autodop/common/dockerc/api/ContainerOps.java
  4. 2 0
      common/src/main/java/cn/reghao/autodop/common/dockerc/api/ImageOps.java
  5. 4 9
      dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppStatusServiceImpl.java
  6. 9 9
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/caching/OrchestrationCaching.java
  7. 6 6
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppLogController.java
  8. 39 20
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppOrchestrateController.java
  9. 8 8
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppStatusController.java
  10. 2 4
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppDeploy.java
  11. 9 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppLog.java
  12. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java
  13. 10 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java
  14. 7 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/ProjOrchestration.java
  15. 30 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppDAO.java
  16. 3 3
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjDAO.java
  17. 90 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppLogManager.java
  18. 111 81
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOrchestrateService.java
  19. 4 58
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusManager.java
  20. 2 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java
  21. 1 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java
  22. 0 16
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppVO.java
  23. 2 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/PageList.java
  24. 0 14
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ProjVO.java
  25. 53 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ResultVO.java
  26. 4 1
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/GlobalExceptionHandler.java
  27. 52 0
      dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/hibernate/HibernateSessionOps.java
  28. 4 2
      dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java
  29. 1 0
      scripts/test.json

+ 2 - 0
common/src/main/java/cn/reghao/autodop/common/deploy/AppStatus.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.deploy;
 
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * @author reghao
  * @date 2020-05-19 20:32:35

+ 5 - 4
common/src/main/java/cn/reghao/autodop/common/dockerc/DockerClient.java

@@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory;
 
 import java.io.*;
 import java.nio.charset.StandardCharsets;
+import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -302,7 +303,7 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
      * @date 2020-05-19 上午10:26
      */
     @Override
-    public List<String> fileLog(String containerId, String logLevel, String logPath) throws IOException {
+    public List<String> fileLog(String containerId, String logLevel, String logPath) throws DockerException {
         LogLevel level = LogLevel.valueOf(logLevel);
         switch (level) {
             case info:
@@ -312,15 +313,15 @@ public class DockerClient implements ImageOps, ContainerOps, AutoCloseable {
                 // error 日志目录
                 return appLog(containerId, logPath);
             default:
-                return null;
+                throw new DockerException(level + " 日志类型不存在");
         }
     }
 
-    private List<String> appLog(String containerId, String filePath) throws IOException {
+    private List<String> appLog(String containerId, String filePath) throws DockerException {
         String logDir = rootfs(containerId) + filePath;
         File dir = new File(logDir);
         if (!dir.exists()) {
-            return null;
+            throw new DockerException(logDir + " 日志目录不存在");
         } else {
             return Arrays.stream(Objects.requireNonNull(dir.listFiles()))
                     .map(File::getName)

+ 1 - 2
common/src/main/java/cn/reghao/autodop/common/dockerc/api/ContainerOps.java

@@ -4,7 +4,6 @@ import cn.reghao.autodop.common.dockerc.pojo.Container;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
 import cn.reghao.autodop.common.dockerc.pojo.ContainerInspect;
 
-import java.io.IOException;
 import java.util.List;
 
 /**
@@ -51,7 +50,7 @@ public interface ContainerOps {
      * @return
      * @date 2020-05-19 上午10:58
      */
-    List<String> fileLog(String containerId, String logLevel, String logPath) throws IOException;
+    List<String> fileLog(String containerId, String logLevel, String logPath) throws DockerException;
 
     /**
      * 查看容器的详细信息

+ 2 - 0
common/src/main/java/cn/reghao/autodop/common/dockerc/api/ImageOps.java

@@ -2,6 +2,8 @@ package cn.reghao.autodop.common.dockerc.api;
 
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
 
+import java.security.NoSuchAlgorithmException;
+
 /**
  * @author reghao
  * @date 2019-12-10 17:48:08

+ 4 - 9
dagent/src/main/java/cn/reghao/autodop/dagent/app/DockerAppStatusServiceImpl.java

@@ -9,6 +9,7 @@ import cn.reghao.autodop.common.grpc.facade.app.AppStatusService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -66,18 +67,12 @@ public class DockerAppStatusServiceImpl implements AppStatusService {
             appStatus.setCommitId(commitId);
             appStatus.setStatus(status);
             if ("running".equals(status)) {
-                appStatus.setStartedTime(date.toString());
-            } else {
-                appStatus.setStartedTime("0");
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                String datetime = sdf.format(date);
+                appStatus.setStartedTime(datetime);
             }
 
             return appStatus;
         }
     }
-
-    public static void main(String[] args) throws DockerException {
-        AppStatusService statusService = new DockerAppStatusServiceImpl();
-        /*AppStatus status = statusService.status("timuke");
-        log.info("{}", status);*/
-    }
 }

+ 9 - 9
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/caching/OrchestrationCaching.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.app.caching;
 
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
-import cn.reghao.autodop.dmaster.app.repository.AppDAO;
+import cn.reghao.autodop.dmaster.app.repository.orchestration.ProjDAO;
 import cn.reghao.autodop.dmaster.app.repository.build.AppCompileRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppPackRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppUpdateRepository;
@@ -26,22 +26,22 @@ public class OrchestrationCaching {
     private AppCompileRepository appCompileRepository;
     private AppPackRepository appPackRepository;
     private NotificationRepository notificationRepository;
-    private AppDAO appDAO;
+    private ProjDAO projDAO;
 
     public OrchestrationCaching(ProjectOrchestrationRepository projRepository,
-                              AppOrchestrationRepository appRepository,
-                              AppUpdateRepository appUpdateRepository,
-                              AppCompileRepository appCompileRepository,
-                              AppPackRepository appPackRepository,
-                              NotificationRepository notificationRepository,
-                              AppDAO appDAO) {
+                                AppOrchestrationRepository appRepository,
+                                AppUpdateRepository appUpdateRepository,
+                                AppCompileRepository appCompileRepository,
+                                AppPackRepository appPackRepository,
+                                NotificationRepository notificationRepository,
+                                ProjDAO projDAO) {
         this.projRepository = projRepository;
         this.appRepository = appRepository;
         this.appUpdateRepository = appUpdateRepository;
         this.appCompileRepository = appCompileRepository;
         this.appPackRepository = appPackRepository;
         this.notificationRepository = notificationRepository;
-        this.appDAO = appDAO;
+        this.projDAO = projDAO;
     }
 
     @Cacheable(cacheNames = "proj", key = "#proj.projId")

+ 6 - 6
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppLogController.java

@@ -1,6 +1,6 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.dmaster.app.service.AppManager;
+import cn.reghao.autodop.dmaster.app.service.AppLogManager;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -21,10 +21,10 @@ import java.util.List;
 @RestController
 @RequestMapping("/api/app")
 public class AppLogController {
-    private AppManager appManager;
+    private AppLogManager logManager;
 
-    public AppLogController(AppManager appManager) {
-        this.appManager = appManager;
+    public AppLogController(AppLogManager logManager) {
+        this.logManager = logManager;
     }
 
     @ApiOperation(value = "获取应用所有日志")
@@ -35,7 +35,7 @@ public class AppLogController {
     public ResponseEntity<String> appLogs(@PathVariable("appId") String appId,
                                           @RequestParam("logType") String logType,
                                           @RequestParam("logLevel") String logLevel) throws Exception {
-        List<String> logs = appManager.logFiles(appId, logType, logLevel);
+        List<String> logs = logManager.logFiles(appId, logType, logLevel);
 
         return ResponseEntity.ok().body(WebResult.success(logs));
     }
@@ -49,7 +49,7 @@ public class AppLogController {
                                          @RequestParam("logType") String logType,
                                          @RequestParam("logLevel") String logLevel,
                                          @RequestParam("logName") String logName) throws Exception {
-        List<String> logs = appManager.logContent(appId, logType, logLevel, logName);
+        List<String> logs = logManager.logContent(appId, logType, logLevel, logName);
         return ResponseEntity.ok().body(WebResult.success(logs));
     }
 }

+ 39 - 20
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppOrchestrateController.java

@@ -1,11 +1,12 @@
 package cn.reghao.autodop.dmaster.app.controller;
 
-import cn.reghao.autodop.dmaster.app.service.OrchestrateService;
+import cn.reghao.autodop.dmaster.app.service.AppOrchestrateService;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.PageRequest;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -17,47 +18,65 @@ import org.springframework.web.bind.annotation.*;
 @RestController
 @RequestMapping("/api/app/orchestrate")
 public class AppOrchestrateController {
-    private OrchestrateService orchestrateService;
+    private AppOrchestrateService appOrchestrateService;
 
-    public AppOrchestrateController(OrchestrateService orchestrateService) {
-        this.orchestrateService = orchestrateService;
+    public AppOrchestrateController(AppOrchestrateService appOrchestrateService) {
+        this.appOrchestrateService = appOrchestrateService;
     }
 
     @ApiOperation(value = "添加项目/应用编排")
     @PostMapping(value = "/{type}", consumes = "application/json")
-    public String addOrchestration(@PathVariable("type") int type, @RequestBody String json) throws Exception {
-        orchestrateService.add(type, json);
-        return WebResult.success("ok");
+    public ResponseEntity<String>addOrchestration(@PathVariable("type") int type, @RequestBody String json) throws Exception {
+        appOrchestrateService.add(type, json);
+        return ResponseEntity.ok().body(WebResult.success("ok"));
     }
 
-    @ApiOperation(value = "批量添加项目/应用编排")
-    @PostMapping(value = "/batch/{type}", consumes = "application/json")
-    public String batchAddOrchestration(@PathVariable("type") int type, @RequestBody String json) throws Exception {
-        orchestrateService.batchAdd(type, json);
-        return WebResult.success("ok");
+    @ApiOperation(value = "复制项目/应用编排")
+    @PostMapping(value = "/duplicate/{type}", consumes = "application/json")
+    public ResponseEntity<String>duplicateOrchestration(@PathVariable("type") int type,
+                                         @RequestParam("from") String from,
+                                         @RequestParam("to") String to) throws Exception {
+        boolean res = appOrchestrateService.duplicate(type, from, to);
+        if (res) {
+            return ResponseEntity.ok().body(WebResult.success("复制成功"));
+        } else {
+            return ResponseEntity.ok().body(WebResult.fail("复制失败"));
+        }
+    }
+
+    @ApiOperation(value = "获取项目/应用编排")
+    @GetMapping("/{type}/{id}")
+    public ResponseEntity<String> getOrchestration(@PathVariable("type") int type, @PathVariable("id") String id) {
+        Object res = appOrchestrateService.get(type, id);
+        return ResponseEntity.ok().body(WebResult.success(res));
     }
 
     @ApiOperation(value = "分页获取项目/应用编排")
     @GetMapping("/{type}")
-    public String getOrchestrationByPage(@PathVariable("type") int type,
+    public ResponseEntity<String>getOrchestrationByPage(@PathVariable("type") int type,
                                          @RequestParam("page") int page,
                                          @RequestParam("size") int size) {
         PageRequest pageRequest = PageRequest.of(page-1, size);
-        return WebResult.success(orchestrateService.getByPage(type, pageRequest));
+        Object res = appOrchestrateService.getByPage(type, pageRequest);
+        return ResponseEntity.ok().body(WebResult.success(res));
     }
 
     @ApiOperation(value = "修改项目/应用编排")
     @PutMapping("/{type}")
-    public String modifyOrchestration(@PathVariable("type") int type, @RequestBody String json) {
-        orchestrateService.modify(type, json);
-        return WebResult.success("ok");
+    public ResponseEntity<String> modifyOrchestration(@PathVariable("type") int type, @RequestBody String json) {
+        boolean res = appOrchestrateService.modify(type, json);
+        if (res) {
+            return ResponseEntity.ok().body(WebResult.success("ok"));
+        } else {
+            return ResponseEntity.ok().body(WebResult.fail("ok"));
+        }
     }
 
     @ApiOperation(value = "删除项目/应用编排")
     @DeleteMapping("/{type}/{appId}")
-    public String deleteOrchestration(@PathVariable("type") int type,
+    public ResponseEntity<String>deleteOrchestration(@PathVariable("type") int type,
                                       @PathVariable("appId") String appId) {
-        orchestrateService.delete(type, appId);
-        return WebResult.success("ok");
+        appOrchestrateService.delete(type, appId);
+        return ResponseEntity.ok().body(WebResult.success("ok"));
     }
 }

+ 8 - 8
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/controller/AppStatusController.java

@@ -2,7 +2,7 @@ package cn.reghao.autodop.dmaster.app.controller;
 
 import cn.reghao.autodop.common.deploy.AppStatus;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
-import cn.reghao.autodop.dmaster.app.service.AppManager;
+import cn.reghao.autodop.dmaster.app.service.AppStatusManager;
 import cn.reghao.autodop.dmaster.common.webresult.WebResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -23,10 +23,10 @@ import java.util.List;
 @RestController
 @RequestMapping("/api/app")
 public class AppStatusController {
-    private AppManager appManager;
+    private AppStatusManager statusManager;
     
-    public AppStatusController(AppManager appManager) {
-        this.appManager = appManager;
+    public AppStatusController(AppStatusManager statusManager) {
+        this.statusManager = statusManager;
     }
 
     @ApiOperation(value = "启动应用")
@@ -36,7 +36,7 @@ public class AppStatusController {
     )
     @PostMapping("/start/{appId}")
     public ResponseEntity<String> start(@PathVariable("appId") String appId) throws DockerException {
-        appManager.start(appId);
+        statusManager.start(appId);
         return ResponseEntity.ok().body("ok");
     }
 
@@ -47,7 +47,7 @@ public class AppStatusController {
     )
     @PostMapping("/stop/{appId}")
     public ResponseEntity<String> stop(@PathVariable("appId") String appId) throws DockerException {
-        appManager.stop(appId);
+        statusManager.stop(appId);
         return ResponseEntity.ok().body("ok");
     }
 
@@ -58,14 +58,14 @@ public class AppStatusController {
     )
     @PostMapping("/restart/{appId}")
     public ResponseEntity<String> restart(@PathVariable("appId") String appId) throws DockerException {
-        appManager.restart(appId);
+        statusManager.restart(appId);
         return ResponseEntity.ok().body("ok");
     }
 
     @ApiOperation(value = "获取所有已注册应用的运行状态")
     @GetMapping("/status")
     public ResponseEntity<String> status() throws DockerException {
-        List<AppStatus> statusList = appManager.status();
+        List<AppStatus> statusList = statusManager.status();
         return ResponseEntity.ok().body(WebResult.success(statusList));
     }
 }

+ 2 - 4
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppDeploy.java

@@ -2,9 +2,7 @@ package cn.reghao.autodop.dmaster.app.entity.deploy;
 
 import lombok.Data;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Embeddable;
-import javax.persistence.OneToMany;
+import javax.persistence.*;
 import java.util.List;
 
 /**
@@ -19,6 +17,6 @@ public class AppDeploy {
     private int httpPort;
     private String healthCheck;
     private String runningDir;
-    @OneToMany(cascade = CascadeType.PERSIST)
+    @ElementCollection
     private List<AppLog> logs;
 }

+ 9 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/deploy/AppLog.java

@@ -6,7 +6,9 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
+import javax.persistence.Embeddable;
 import javax.persistence.Entity;
+import javax.validation.constraints.NotNull;
 
 /**
  * @author reghao
@@ -15,10 +17,14 @@ import javax.persistence.Entity;
 @Data
 @AllArgsConstructor
 @NoArgsConstructor
-@EqualsAndHashCode(callSuper = false)
-@Entity
-public class AppLog extends BaseEntity {
+/*@EqualsAndHashCode(callSuper = false)
+@Entity*/
+@Embeddable
+public class AppLog {
+    @NotNull
     private String logType;
+    @NotNull
     private String logLevel;
+    // 相对于应用运行目录
     private String logdirPath;
 }

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/log/BuildLog.java

@@ -5,6 +5,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import javax.persistence.CascadeType;
+import javax.persistence.Column;
 import javax.persistence.Embeddable;
 import javax.persistence.OneToOne;
 import java.util.Date;
@@ -22,6 +23,7 @@ public class BuildLog {
     private String stage;
     // 0 - 部署成功 1 - 部署失败
     private int code;
+    @Column(length = 1024)
     private String msg;
 
     @OneToOne(cascade = CascadeType.PERSIST)

+ 10 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestration.java

@@ -3,10 +3,12 @@ package cn.reghao.autodop.dmaster.app.entity.orchestration;
 import cn.reghao.autodop.dmaster.app.entity.BaseEntity;
 import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
 import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
+import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import javax.persistence.*;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -16,13 +18,14 @@ import java.util.Map;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Entity
-public class AppOrchestration extends BaseEntity {
+public class AppOrchestration extends BaseEntity implements Cloneable {
     @Column(nullable = false, unique = true)
     private String appId;
     // 应用代码所在目录的名字
     private String dirname;
     private String description;
     private String env;
+    // 是否总是构建
     private boolean alwaysBuild;
     // 编译 app 时所处的目录,以仓库目录为起点
     private String entryDir;
@@ -44,4 +47,10 @@ public class AppOrchestration extends BaseEntity {
     private Notification notification;
     // 是否启用编排
     private boolean enable;
+
+    @Override
+    public Object clone() throws CloneNotSupportedException {
+        Object obj = super.clone();
+        return obj;
+    }
 }

+ 7 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/entity/orchestration/ProjOrchestration.java

@@ -15,11 +15,17 @@ import javax.persistence.Entity;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Entity
-public class ProjOrchestration extends BaseEntity {
+public class ProjOrchestration extends BaseEntity implements Cloneable {
     @Column(nullable = false, unique = true)
     private String projId;
     private String description;
     private String projRepo;
     // 同一个项目内所有应用的构建策略是相同的
     private AppBuild appBuild;
+
+    @Override
+    public Object clone() throws CloneNotSupportedException {
+        Object obj = super.clone();
+        return obj;
+    }
 }

+ 30 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/AppDAO.java

@@ -0,0 +1,30 @@
+package cn.reghao.autodop.dmaster.app.repository.orchestration;
+
+import org.hibernate.Session;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+/**
+ * @author reghao
+ * @date 2020-03-02 16:45:12
+ */
+@Service
+public class AppDAO {
+    private EntityManager em;
+
+    public AppDAO(EntityManager em) {
+        this.em = em;
+    }
+
+    public void findByAppId(String appId) {
+        try (Session session = (Session) em.getDelegate()) {
+            Query query = session
+                    .createQuery("select app from AppOrchestration app where app.appId = :appId")
+                    .setParameter("appId", appId);
+
+            Object obj = query.getSingleResult();
+        }
+    }
+}

+ 3 - 3
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/AppDAO.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/repository/orchestration/ProjDAO.java

@@ -1,4 +1,4 @@
-package cn.reghao.autodop.dmaster.app.repository;
+package cn.reghao.autodop.dmaster.app.repository.orchestration;
 
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import org.hibernate.Session;
@@ -14,10 +14,10 @@ import java.util.List;
  * @date 2020-03-02 16:45:12
  */
 @Service
-public class AppDAO {
+public class ProjDAO {
     private EntityManager em;
 
-    public AppDAO(EntityManager em) {
+    public ProjDAO(EntityManager em) {
         this.em = em;
     }
 

+ 90 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppLogManager.java

@@ -0,0 +1,90 @@
+package cn.reghao.autodop.dmaster.app.service;
+
+import cn.reghao.autodop.common.grpc.client.GrpcClientProxy;
+import cn.reghao.autodop.common.grpc.facade.app.AppLogService;
+import cn.reghao.autodop.dmaster.app.caching.DeployCaching;
+import cn.reghao.autodop.dmaster.app.caching.OrchestrationCaching;
+import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
+import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 应用日志管理
+ *
+ * @author reghao
+ * @date 2019-11-27 11:30:28
+ */
+@Service
+public class AppLogManager {
+    private final int GRPC_PORT = 4001;
+    private OrchestrationCaching caching;
+    private DeployCaching deployCaching;
+
+    public AppLogManager(OrchestrationCaching caching, DeployCaching deployCaching) {
+        this.caching = caching;
+        this.deployCaching = deployCaching;
+    }
+
+    public List<String> logFiles(String appId, String logType, String logLevel) throws Exception {
+        /*AppOrchestration app = caching.findByAppId(appId);
+        AppDeploy appDeploy = app.getAppDeploy();
+        List<AppLog> appLogs = appDeploy.getLogs();
+        if (appLogs.isEmpty()) {
+            throw new Exception("日志未配置");
+        }
+
+        String logdirPath = null;
+        for (AppLog appLog : appLogs) {
+            if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
+                // TODO 只有控制台日志的 logPath 才为 null
+                logdirPath = appLog.getLogdirPath();
+                break;
+            }
+        }
+
+        String[] hosts = app.getAppDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppLogService logService = (AppLogService) new GrpcClientProxy<AppLogService>()
+                    .getProxy(host, GRPC_PORT, AppLogService.class);
+
+            // TODO logs 为 null 表示没有日志
+            List<String> logFiles = logService.logFiles(appId, logType, logLevel, logdirPath);
+            return logFiles;
+        }*/
+
+        return null;
+    }
+
+    public List<String> logContent(String appId, String logType, String logLevel, String logName) throws Exception {
+        /*AppOrchestration app = caching.findByAppId(appId);
+        AppDeploy appDeploy = app.getAppDeploy();
+        List<AppLog> appLogs = appDeploy.getLogs();
+        if (appLogs.isEmpty()) {
+            throw new Exception("日志未配置");
+        }
+
+        String logfilePath = null;
+        for (AppLog appLog : appLogs) {
+            if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
+                // TODO 只有控制台日志的 logPath 才为 null
+                logfilePath = appLog.getLogdirPath() + "/" + logName;
+                break;
+            }
+        }
+
+        String[] hosts = app.getAppDeploy().getHosts().split(",");
+        for (String host : hosts) {
+            AppLogService logService = (AppLogService) new GrpcClientProxy<AppLogService>()
+                    .getProxy(host, GRPC_PORT, AppLogService.class);
+
+            // TODO logs 为 null 表示没有日志
+            List<String> logContent = logService.logContent(appId, logType, logLevel, logfilePath);
+            return logContent;
+        }*/
+
+        return null;
+    }
+}

+ 111 - 81
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/OrchestrateService.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppOrchestrateService.java

@@ -8,22 +8,21 @@ import cn.reghao.autodop.dmaster.app.entity.build.update.AppUpdate;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
-import cn.reghao.autodop.dmaster.app.repository.AppDAO;
+import cn.reghao.autodop.dmaster.app.repository.orchestration.ProjDAO;
 import cn.reghao.autodop.dmaster.app.repository.build.AppCompileRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppPackRepository;
 import cn.reghao.autodop.dmaster.app.repository.build.AppUpdateRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.AppOrchestrationRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.NotificationRepository;
 import cn.reghao.autodop.dmaster.app.repository.orchestration.ProjectOrchestrationRepository;
-import cn.reghao.autodop.dmaster.app.vo.AppVO;
 import cn.reghao.autodop.dmaster.app.vo.PageList;
-import cn.reghao.autodop.dmaster.app.vo.ProjVO;
-import cn.reghao.autodop.dmaster.common.webresult.WebResult;
+import cn.reghao.autodop.dmaster.app.vo.ResultVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -31,29 +30,29 @@ import java.util.List;
  * @date 2020-02-28 17:10:37
  */
 @Service
-public class OrchestrateService {
+public class AppOrchestrateService {
     private ProjectOrchestrationRepository projRepository;
     private AppOrchestrationRepository appRepository;
     private AppUpdateRepository appUpdateRepository;
     private AppCompileRepository appCompileRepository;
     private AppPackRepository appPackRepository;
     private NotificationRepository notificationRepository;
-    private AppDAO appDAO;
-
-    public OrchestrateService(ProjectOrchestrationRepository projRepository,
-                              AppOrchestrationRepository appRepository,
-                              AppUpdateRepository appUpdateRepository,
-                              AppCompileRepository appCompileRepository,
-                              AppPackRepository appPackRepository,
-                              NotificationRepository notificationRepository,
-                              AppDAO appDAO) {
+    private ProjDAO projDAO;
+
+    public AppOrchestrateService(ProjectOrchestrationRepository projRepository,
+                                 AppOrchestrationRepository appRepository,
+                                 AppUpdateRepository appUpdateRepository,
+                                 AppCompileRepository appCompileRepository,
+                                 AppPackRepository appPackRepository,
+                                 NotificationRepository notificationRepository,
+                                 ProjDAO projDAO) {
         this.projRepository = projRepository;
         this.appRepository = appRepository;
         this.appUpdateRepository = appUpdateRepository;
         this.appCompileRepository = appCompileRepository;
         this.appPackRepository = appPackRepository;
         this.notificationRepository = notificationRepository;
-        this.appDAO = appDAO;
+        this.projDAO = projDAO;
     }
 
     public void add(int type, String json) {
@@ -70,22 +69,57 @@ public class OrchestrateService {
                 // 应用编排
                 // TODO 添加应用的配置文件
                 AppOrchestration app = (AppOrchestration) JsonUtil.jsonToObject(json, AppOrchestration.class);
-                String projId = app.getProjId();
-                if (projId == null) {
-                    appBuild = app.getAppBuild();
-                    checkSharedEntity(appBuild);
-                }
+                saveApp(app);
+            default:
+        }
+    }
 
-                Notification notification = app.getNotification();
-                Notification notifyEntity = notificationRepository.findByNotifyName(notification.getNotifyName());
-                if (notifyEntity != null) {
-                    app.setNotification(notifyEntity);
-                } else {
-                    notificationRepository.save(notification);
-                }
+    private void saveApp(AppOrchestration app) {
+        String projId = app.getProjId();
+        if (projId == null) {
+            AppBuild appBuild = app.getAppBuild();
+            checkSharedEntity(appBuild);
+        }
+
+        Notification notification = app.getNotification();
+        Notification notifyEntity = notificationRepository.findByNotifyName(notification.getNotifyName());
+        if (notifyEntity != null) {
+            app.setNotification(notifyEntity);
+        } else {
+            notificationRepository.save(notification);
+        }
+
+        appRepository.save(app);
+    }
 
-                appRepository.save(app);
+    public boolean duplicate(int type, String from, String to) throws Exception {
+        switch (type) {
+            case 1:
+                ProjOrchestration projEntity = projRepository.findByProjId(from);
+                ProjOrchestration proj = projRepository.findByProjId(to);
+                if (projEntity != null && proj == null) {
+                    proj = (ProjOrchestration) projEntity.clone();
+                    proj.setProjId(to);
+                    proj.setId(null);
+                    checkSharedEntity(proj.getAppBuild());
+                    projRepository.save(proj);
+                    return true;
+                }
+            case 2:
+                AppOrchestration appEntity = appRepository.findByAppId(from);
+                AppOrchestration app = appRepository.findByAppId(to);
+                if (appEntity != null && app == null) {
+                    app = (AppOrchestration) appEntity.clone();
+                    app.setAppId(to);
+                    app.setId(null);
+                    // TODO 复制共享实体
+                    app.setConfigFiles(null);
+                    app.getAppDeploy().setLogs(null);
+                    saveApp(app);
+                    return true;
+                }
             default:
+                return false;
         }
     }
 
@@ -126,81 +160,77 @@ public class OrchestrateService {
         }
     }
 
-    public void batchAdd(int type, String json) throws Exception {
-        // TODO 优化代码
-        AppBuild appBuild;
+    public Object get(int type, String id) {
         switch (type) {
             case 1:
-                List<Object> objs = JsonUtil.jsonToObjectArray(json, ProjOrchestration.class);
-                List<ProjOrchestration> projs = new ArrayList<>();
-                for (Object obj : objs) {
-                    ProjOrchestration proj = (ProjOrchestration) obj;
-                    appBuild = proj.getAppBuild();
-                    checkSharedEntity(appBuild);
-                    projs.add(proj);
-                }
-                projRepository.saveAll(projs);
-                break;
+                ProjOrchestration proj = projRepository.findByProjId(id);
+                return ResultVO.projVO(proj);
             case 2:
-                List<Object> objs1 = JsonUtil.jsonToObjectArray(json, AppOrchestration.class);
-                List<AppOrchestration> apps = new ArrayList<>();
-                for (Object obj : objs1) {
-                    AppOrchestration app = (AppOrchestration) obj;
-                    String projId = app.getProjId();
-                    if (projId == null) {
-                        appBuild = app.getAppBuild();
-                        checkSharedEntity(appBuild);
-                    }
-                    Notification notification = app.getNotification();
-                    Notification notifyEntity = notificationRepository.findByNotifyName(notification.getNotifyName());
-                    if (notifyEntity != null) {
-                        app.setNotification(notifyEntity);
-                    } else {
-                        notificationRepository.save(notification);
-                    }
-                    apps.add(app);
-                }
-                // TODO 使用 saveAll 时若多个编排中具有相同的 UNIQUE 约束值会引发 UNIQUE 约束异常
-                appRepository.saveAll(apps);
+                AppOrchestration app = appRepository.findByAppId(id);
+                return ResultVO.appVO(app);
             default:
+                return "编排类型错误";
         }
     }
 
-    public String getByPage(int type, PageRequest pageRequest) {
+    public Object getByPage(int type, PageRequest pageRequest) {
         switch (type) {
             case 1:
                 Page<ProjOrchestration> projPages = projRepository.findAll(pageRequest);
-                List<ProjVO> vos = new ArrayList<>();
+                List<ProjOrchestration> projVOs = new ArrayList<>();
                 projPages.forEach(proj -> {
-                    List<String> appIds = appDAO.findAppsByProjId(proj.getProjId());
-                    ProjVO vo = ProjVO.of(proj, appIds.toString()
-                            .replace("[", "").replace("]", ""));
-                    vos.add(vo);
+                    projVOs.add(ResultVO.projVO(proj));
                 });
 
-                PageList<ProjVO> list = new PageList<>();
-                list.setList(vos);
-                list.setSize(vos.size());
-
-                return WebResult.success(list);
+                PageList<ProjOrchestration> projs = new PageList<>();
+                projs.setList(projVOs);
+                projs.setSize(projVOs.size());
+                return projs;
             case 2:
                 Page<AppOrchestration> appPages = appRepository.findAll(pageRequest);
-                List<AppVO> appVOS = new ArrayList<>();
+                List<AppOrchestration> appVOs = new ArrayList<>();
                 appPages.getContent().forEach(app -> {
-                    appVOS.add(AppVO.of(app));
+                    appVOs.add(ResultVO.appVO(app));
                 });
 
-                PageList<AppVO> list1 = new PageList<>();
-                list1.setList(appVOS);
-                list1.setSize(appVOS.size());
-
-                return WebResult.success(list1);
+                PageList<AppOrchestration> apps = new PageList<>();
+                apps.setList(appVOs);
+                apps.setSize(appVOs.size());
+                return apps;
             default:
-                return WebResult.fail("编排类型错误");
+                return "编排类型错误";
         }
     }
 
-    public void modify(int type, String json) {
+    public boolean modify(int type, String json) {
+        switch (type) {
+            case 1:
+                ProjOrchestration proj = (ProjOrchestration) JsonUtil.jsonToObject(json, ProjOrchestration.class);
+                ProjOrchestration projEntity = projRepository.findByProjId(proj.getProjId());
+                if (projEntity != null) {
+                    AppBuild appBuild = proj.getAppBuild();
+                    checkSharedEntity(appBuild);
+
+                    proj.setId(projEntity.getId());
+                    proj.setCreateTime(projEntity.getCreateTime());
+                    proj.setUpdateTime(new Date());
+                    projRepository.save(proj);
+                    return true;
+                }
+            case 2:
+                AppOrchestration app = (AppOrchestration) JsonUtil.jsonToObject(json, AppOrchestration.class);
+                String appId = app.getAppId();
+                AppOrchestration appEntity = appRepository.findByAppId(appId);
+                if (appEntity != null) {
+                    app.setId(appEntity.getId());
+                    app.setCreateTime(appEntity.getCreateTime());
+                    app.setUpdateTime(new Date());
+                    saveApp(app);
+                    return true;
+                }
+            default:
+                return false;
+        }
     }
 
     public void delete(int type, String appId) {

+ 4 - 58
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppManager.java → dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/AppStatusManager.java

@@ -3,12 +3,9 @@ package cn.reghao.autodop.dmaster.app.service;
 import cn.reghao.autodop.common.deploy.AppStatus;
 import cn.reghao.autodop.common.dockerc.exception.DockerException;
 import cn.reghao.autodop.common.grpc.client.GrpcClientProxy;
-import cn.reghao.autodop.common.grpc.facade.app.AppLogService;
 import cn.reghao.autodop.common.grpc.facade.app.AppStatusService;
 import cn.reghao.autodop.dmaster.app.caching.DeployCaching;
 import cn.reghao.autodop.dmaster.app.caching.OrchestrationCaching;
-import cn.reghao.autodop.dmaster.app.entity.deploy.AppDeploy;
-import cn.reghao.autodop.dmaster.app.entity.deploy.AppLog;
 import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
 import com.alibaba.fastjson.JSONObject;
 import org.springframework.stereotype.Service;
@@ -17,18 +14,18 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * 应用管理
+ * 应用状态管理
  *
  * @author reghao
  * @date 2019-11-27 11:30:28
  */
 @Service
-public class AppManager {
+public class AppStatusManager {
     private final int GRPC_PORT = 4001;
     private OrchestrationCaching caching;
     private DeployCaching deployCaching;
 
-    public AppManager(OrchestrationCaching caching, DeployCaching deployCaching) {
+    public AppStatusManager(OrchestrationCaching caching, DeployCaching deployCaching) {
         this.caching = caching;
         this.deployCaching = deployCaching;
     }
@@ -86,6 +83,7 @@ public class AppManager {
             apps.add(caching.findByAppId(appId));
         });
 
+        // TODO 异步处理
         for (AppOrchestration app : apps) {
             String[] hosts = app.getAppDeploy().getHosts().split(",");
             for (String host : hosts) {
@@ -102,56 +100,4 @@ public class AppManager {
 
         return appStatusList;
     }
-
-    public List<String> logFiles(String appId, String logType, String logLevel) throws Exception {
-        AppOrchestration app = caching.findByAppId(appId);
-        AppDeploy appDeploy = app.getAppDeploy();
-        List<AppLog> appLogs = appDeploy.getLogs();
-        String logdirPath = null;
-        for (AppLog appLog : appLogs) {
-            if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
-                // TODO 只有控制台日志的 logPath 才为 null
-                logdirPath = appLog.getLogdirPath();
-                break;
-            }
-        }
-
-        String[] hosts = app.getAppDeploy().getHosts().split(",");
-        for (String host : hosts) {
-            AppLogService logService = (AppLogService) new GrpcClientProxy<AppLogService>()
-                    .getProxy(host, GRPC_PORT, AppLogService.class);
-
-            // TODO logs 为 null 表示没有日志
-            List<String> logFiles = logService.logFiles(appId, logType, logLevel, logdirPath);
-            return logFiles;
-        }
-
-        return null;
-    }
-
-    public List<String> logContent(String appId, String logType, String logLevel, String logName) throws Exception {
-        AppOrchestration app = caching.findByAppId(appId);
-        AppDeploy appDeploy = app.getAppDeploy();
-        List<AppLog> appLogs = appDeploy.getLogs();
-        String logfilePath = null;
-        for (AppLog appLog : appLogs) {
-            if (appLog.getLogType().equals(logType) && appLog.getLogLevel().equals(logLevel)) {
-                // TODO 只有控制台日志的 logPath 才为 null
-                logfilePath = appLog.getLogdirPath() + "/" + logName;
-                break;
-            }
-        }
-
-        String[] hosts = app.getAppDeploy().getHosts().split(",");
-        for (String host : hosts) {
-            AppLogService logService = (AppLogService) new GrpcClientProxy<AppLogService>()
-                    .getProxy(host, GRPC_PORT, AppLogService.class);
-
-            // TODO logs 为 null 表示没有日志
-            List<String> logContent = logService.logContent(appId, logType, logLevel, logfilePath);
-            return logContent;
-        }
-
-        return null;
-    }
 }

+ 2 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/AppIntegrate.java

@@ -189,7 +189,8 @@ public class AppIntegrate {
 
     private AppUpdateStatus updateProj() throws Exception {
         String remoteRepo = proj.getProjRepo();
-        CommitLog current = codeUpdater.update(remoteRepo, appLocalRepo);
+        codeUpdater.update(remoteRepo, appLocalRepo);
+        CommitLog current = codeUpdater.lastCommitInfo(appLocalRepo + "/" + app.getDirname());
         if (lastCommitLog == null ||
                 current.getCommitTime() > lastCommitLog.getCommitTime() ||
                 app.isAlwaysBuild()) {

+ 1 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/service/build/BuildDispatcher.java

@@ -65,6 +65,7 @@ public class BuildDispatcher {
             });
         }
 
+        // TODO 缓存 appIntegrates,AppOrchestration 没有变化时 AppIntegrate 也应该不变
         List<AppIntegrate> appIntegrates = appIntegrates(existApps);
         ExecutorService threadPool = ThreadPoolWrapper.threadPool("dispatcher");
         List<Future<BuildDeployLog>> appFutures = new ArrayList<>();

+ 0 - 16
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/AppVO.java

@@ -1,16 +0,0 @@
-package cn.reghao.autodop.dmaster.app.vo;
-
-import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
-
-/**
- * @author reghao
- * @date 2020-02-29 17:22:19
- */
-public class AppVO {
-    protected String appId;
-
-    public static AppVO of(AppOrchestration app) {
-        AppVO vo = new AppVO();
-        return vo;
-    }
-}

+ 2 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/PageList.java

@@ -5,6 +5,8 @@ import lombok.Data;
 import java.util.List;
 
 /**
+ * 分页列表
+ *
  * @author reghao
  * @date 2020-03-05 17:39:53
  */

+ 0 - 14
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ProjVO.java

@@ -1,14 +0,0 @@
-package cn.reghao.autodop.dmaster.app.vo;
-
-import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
-
-/**
- * @author reghao
- * @date 2020-02-29 17:22:19
- */
-public class ProjVO {
-    public static ProjVO of(ProjOrchestration proj, String appIds) {
-        ProjVO vo = new ProjVO();
-        return vo;
-    }
-}

+ 53 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/app/vo/ResultVO.java

@@ -0,0 +1,53 @@
+package cn.reghao.autodop.dmaster.app.vo;
+
+import cn.reghao.autodop.dmaster.app.entity.build.AppBuild;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.AppOrchestration;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.Notification;
+import cn.reghao.autodop.dmaster.app.entity.orchestration.ProjOrchestration;
+
+/**
+ * @author reghao
+ * @date 2020-02-29 17:22:19
+ */
+public class ResultVO {
+    protected String appId;
+
+    public static ProjOrchestration projVO(ProjOrchestration proj) {
+        proj.setId(null);
+        proj.setCreateTime(null);
+        proj.setUpdateTime(null);
+        appBuildVO(proj.getAppBuild());
+        return proj;
+    }
+
+    public static AppOrchestration appVO(AppOrchestration app) {
+        app.setId(null);
+        app.setCreateTime(null);
+        app.setUpdateTime(null);
+
+        Notification notification = app.getNotification();
+        notification.setId(null);
+        notification.setCreateTime(null);
+        notification.setUpdateTime(null);
+
+        if (app.getProjId() == null) {
+            appBuildVO(app.getAppBuild());
+        }
+
+        return app;
+    }
+
+    private static void appBuildVO(AppBuild appBuild) {
+        appBuild.getAppUpdate().setId(null);
+        appBuild.getAppUpdate().setCreateTime(null);
+        appBuild.getAppUpdate().setUpdateTime(null);
+
+        appBuild.getAppCompile().setId(null);
+        appBuild.getAppCompile().setCreateTime(null);
+        appBuild.getAppCompile().setUpdateTime(null);
+
+        appBuild.getAppPack().setId(null);
+        appBuild.getAppPack().setCreateTime(null);
+        appBuild.getAppPack().setUpdateTime(null);
+    }
+}

+ 4 - 1
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/exception/GlobalExceptionHandler.java

@@ -23,7 +23,10 @@ public class GlobalExceptionHandler {
      */
     @ExceptionHandler({Exception.class})
     public String error(Exception e) {
-        return WebResult.error(stackTrace(e));
+        String stackTrace = stackTrace(e);
+        String msg = e.getMessage();
+
+        return WebResult.error(msg);
     }
 
     private String stackTrace(Exception e) {

+ 52 - 0
dmaster/src/main/java/cn/reghao/autodop/dmaster/common/utils/hibernate/HibernateSessionOps.java

@@ -0,0 +1,52 @@
+package cn.reghao.autodop.dmaster.common.utils.hibernate;
+
+import org.hibernate.Session;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+
+/**
+ * 使用 Hibernate 的 Session 接口进行 CURD 操作
+ *
+ * @author reghao
+ * @date 2020-05-21 14:57:57
+ */
+@Component
+public class HibernateSessionOps {
+    private EntityManager em;
+
+    public HibernateSessionOps(EntityManager em) {
+        this.em = em;
+    }
+
+    public void add() {
+        try (Session session = (Session) em.getDelegate()) {
+
+        }
+    }
+
+    public void get() {
+        try (Session session = (Session) em.getDelegate()) {
+
+        }
+    }
+
+    public void update() {
+        try (Session session = (Session) em.getDelegate()) {
+            String projId = "";
+            String hql = "update app_orchestration ";
+            Query query = session
+                    .createQuery("select app from AppOrchestration app where app.projId = :projId")
+                    .setParameter("projId", projId);
+
+            query.getResultList();
+        }
+    }
+
+    public void delete() {
+        try (Session session = (Session) em.getDelegate()) {
+
+        }
+    }
+}

+ 4 - 2
dmaster/src/test/java/cn/reghao/autodop/dmaster/app/entity/orchestration/AppOrchestrationTest.java

@@ -71,8 +71,10 @@ class AppOrchestrationTest {
                 "svn://192.168.0.214/azy/CodeRepositories/IQuizoo.Service/branches/20200509/DotNetCore");
         app.setEnv("dev");
         app.setEntryDir("/ContentService/4-ContentPresentation/Com.IQuizoo.ContentService");
-        //app.setProjId("branch-20200509");
-        app.setAppBuild(appBuild);
+
+        app.setProjId("branch-20200509");
+        //app.setAppBuild(appBuild);
+
         app.setNotification(notification);
         app.setAppDeploy(appDeploy);
 

+ 1 - 0
scripts/test.json

@@ -0,0 +1 @@
+{}