夜得朦胧 1 ano atrás
pai
commit
2ac724c135

+ 10 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/adapter/controller/TaskController.java

@@ -62,5 +62,15 @@ public class TaskController {
         projectApplicationService.stopMultiProject(param);
     }
 
+    @GetMapping("/multiConfirm")
+    public Boolean multiConfirm(@RequestParam("taskId") String taskId) {
+        return taskApplicationService.multiConfirm(taskId);
+    }
+
+    @GetMapping("/multiTick")
+    public void multiTick(@RequestParam("taskId") String taskId) {
+        taskApplicationService.multiTick(taskId);
+    }
+
 
 }

+ 4 - 4
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/app/service/ProjectApplicationService.java

@@ -528,7 +528,7 @@ public class ProjectApplicationService {
                     }
                 }
             }
-            if (!contains) {
+            if (!contains && multiProjectWaitQueue.getWaitingParallelism() > 0) {
                 waitingQueue.add(multiProjectWaitQueue);
             }
             String newWaitingQueueJson = JsonUtil.listToJson(waitingQueue);
@@ -1055,7 +1055,7 @@ public class ProjectApplicationService {
             for (MultiSimulationProjectTaskRecordPO po: recordPOList) {
                 Integer recordStatus = po.getStatus();
                 if (recordStatus == MultiSimulationTaskStatusEnum.RUN_STATUS.getProjectStatus()){
-                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.TERMINATED_STATUS.getProjectStatus(), po.getId(), 0);
+                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.PERSON_CANCEL_STATUS.getProjectStatus(), po.getId(), 0);
                     // 删除pod
                     String nodeNameKey = "multi-taskId:" + po.getId();
                     String value = stringRedisTemplate.opsForValue().get(nodeNameKey);
@@ -1072,7 +1072,7 @@ public class ProjectApplicationService {
 
                 } else if (recordStatus == MultiSimulationTaskStatusEnum.INIT_STATUS.getProjectStatus()) {
                     // 初始状态时
-                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.TERMINATED_STATUS.getProjectStatus(), po.getId(), 0);
+                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.PERSON_CANCEL_STATUS.getProjectStatus(), po.getId(), 0);
                 }else if (recordStatus == MultiSimulationTaskStatusEnum.NEED_ANALYSIS_STATUS.getProjectStatus() || recordStatus == MultiSimulationTaskStatusEnum.AUTO_TERMINATED_STATUS.getProjectStatus()) {
                     // 不作处理了
                 }
@@ -1195,7 +1195,7 @@ public class ProjectApplicationService {
 
                 MultiTaskMessageEntity build = MultiTaskMessageEntity.builder().info(MultiInfoEntity.builder().project_id(projectId).task_id(taskId).scene_id(sceneId)
                         .default_time(Long.valueOf(projectStartMessageEntity.getDefaultTime()))
-                        .task_path(projectResultPathOfMinio + minioUploadPath).build())
+                        .task_path(projectResultPathOfMinio + "multiResult/" + minioUploadPath).build())
                     .scenario(ScenarioEntity.builder().scenario_osc(mapXmlPathOfMinio).scenario_odr(mapDriverPathOfMinio).scenario_osgb(mapOsgPathOfMinio).build())
                     .vehicle(vehicle)
                     .build();

+ 81 - 14
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/app/service/TaskApplicationService.java

@@ -3,6 +3,7 @@ package com.css.simulation.resource.scheduler.app.service;
 import api.common.pojo.constants.DictConstants;
 import api.common.pojo.enums.MultiSimulationResultTypeEnum;
 import api.common.pojo.enums.MultiSimulationStatusEnum;
+import api.common.pojo.enums.MultiSimulationTaskStatusEnum;
 import api.common.pojo.param.project.MultiCreateYamlRet;
 import api.common.pojo.param.project.MultiSimulationProjectParam;
 import api.common.pojo.po.project.MultiSimulationProjectResultPO;
@@ -15,20 +16,20 @@ import com.css.simulation.resource.scheduler.domain.service.TaskDomainService;
 import com.css.simulation.resource.scheduler.infra.configuration.custom.CustomConfiguration;
 import com.css.simulation.resource.scheduler.infra.configuration.kubernetes.KubernetesConfiguration;
 import com.css.simulation.resource.scheduler.infra.configuration.kubernetes.KubernetesUtil;
-import com.css.simulation.resource.scheduler.infra.db.mysql.mapper.MultiSimulationProjectMapper;
-import com.css.simulation.resource.scheduler.infra.db.mysql.mapper.MultiSimulationProjectResultMapper;
-import com.css.simulation.resource.scheduler.infra.db.mysql.mapper.MultiSimulationProjectTaskRecordMapper;
+import com.css.simulation.resource.scheduler.infra.configuration.minio.MinioConfiguration;
+import com.css.simulation.resource.scheduler.infra.db.mysql.mapper.*;
 import com.css.simulation.resource.scheduler.infra.entity.MultiTaskMessageEntity;
 import com.css.simulation.resource.scheduler.infra.fs.minio.MinioUtil;
 import com.css.simulation.resource.scheduler.infra.db.redis.CustomRedisClient;
 import com.css.simulation.resource.scheduler.infra.entity.PrefixEntity;
 import com.css.simulation.resource.scheduler.infra.entity.ProjectEntity;
 import com.css.simulation.resource.scheduler.infra.entity.TaskEntity;
-import com.css.simulation.resource.scheduler.infra.db.mysql.mapper.SimulationManualProjectTaskMapper;
 import com.css.simulation.resource.scheduler.infra.db.redis.RedisUtil;
 import com.css.simulation.resource.scheduler.infra.mq.kafka.KafkaUtil;
 import io.kubernetes.client.openapi.ApiClient;
+import io.minio.GetPresignedObjectUrlArgs;
 import io.minio.MinioClient;
+import io.minio.http.Method;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.kafka.clients.admin.Admin;
@@ -41,6 +42,7 @@ import org.springframework.util.CollectionUtils;
 import javax.annotation.Resource;
 import java.io.File;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 
 @Service
@@ -76,9 +78,15 @@ public class TaskApplicationService {
     private MultiSimulationProjectMapper multiSimulationProjectMapper;
     @Resource
     private MultiSimulationProjectTaskRecordMapper taskRecordMapper;
+
+    @Resource
+    private MultiSimulationSceneMapper multiSimulationSceneMapper;
     @Resource
     private MultiSimulationProjectResultMapper multiSimulationResultMapper;
 
+    @Resource
+    private MinioConfiguration minioConfiguration;
+
     @Resource(name = "myKafkaAdmin")
     private Admin kafkaAdminClient;
     @Value("${scheduler.linux-path.multi-pod-yaml-directory}")
@@ -239,7 +247,7 @@ public class TaskApplicationService {
             MultiSimulationProjectParam multiSimulationProjectParam = new MultiSimulationProjectParam();
             multiSimulationProjectParam.setProjectId(projectId);
             String projectUserId = projectVO.getProjectUserId();
-            String clusterUserId = projectDomainService.getClusterUserIdByProjectUserId(projectUserId);
+
             // 查询相关信息
             String nodeNameKey = "multi-taskId:" + taskEntity.getId();
             String value = stringRedisTemplate.opsForValue().get(nodeNameKey);
@@ -261,15 +269,17 @@ public class TaskApplicationService {
                 projectDomainService.incrementOneParallelism(isChoiceGpu, nodeName);
                 // 释放证书
                 projectDomainService.releaseLicense(projectDomainService.getClusterUserIdByProjectUserId(projectUserId), DictConstants.MODEL_TYPE_VTD, 1);
-                if (DictConstants.TASK_COMPLETED.equals(state)) {
-                    // 更新状态
-                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationStatusEnum.COMPLETED_STATUS.getProjectStatus(), taskEntity.getId(), 0);
+                // 执行完成待分析状态
+                if (DictConstants.TASK_ANALYSIS.equals(state)){
+                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.NEED_ANALYSIS_STATUS.getProjectStatus(), taskEntity.getId(), 0);
                     // 进行仿真评价
                     String taskBody = taskEntity.getTaskBody();
                     MultiTaskMessageEntity messageEntity = JSONObject.parseObject(taskBody, MultiTaskMessageEntity.class);
                     String taskPath = messageEntity.getInfo().getTask_path();
                     List<String> list = MinioUtil.listAllFileName(minioClient, bucketName, taskPath);
                     String csvName = null;
+                    String allMp4Url = null;
+                    String simulationMp4Url = null;
                     for (String str : list) {
                         if (StringUtils.contains(str, "csv")) {
                             csvName = str;
@@ -279,7 +289,8 @@ public class TaskApplicationService {
                     if (StringUtils.isNotBlank(csvName)) {
                         String linuxPath = linuxTempPath + "multiProject/" + projectId + "/" + taskId + "/";
                         String linuxFile = linuxPath + csvName;
-                        MinioUtil.downloadToFile(minioClient, bucketName, taskPath + csvName, linuxFile);
+                        String minioPathCsv = taskPath + csvName;
+                        MinioUtil.downloadToFile(minioClient, bucketName, minioPathCsv, linuxFile);
                         String pythonCom = "python3 " + multiVtdPodTemplateAnaPy + " --csvFile=\"" + linuxPath + "\"" + " --outputResultFile=\"" + linuxPath + "\"";
                         LinuxUtil.execute(pythonCom);
                         Thread.sleep(10000);
@@ -298,20 +309,44 @@ public class TaskApplicationService {
                         multiSimulationProjectResultPO.setId(StringUtil.getRandomUUID()).setSceneId(taskEntity.getSceneId())
                             .setAbnormalTimeDescription(jsonObject.getString("lane_departure")).setAbnormalType(MultiSimulationResultTypeEnum.OUT_OF_PAVEMENT.getResultType());
                         multiSimulationResultMapper.insertProjectResult(multiSimulationProjectResultPO);
-
                         multiSimulationProjectResultPO = new MultiSimulationProjectResultPO();
                         multiSimulationProjectResultPO.setId(StringUtil.getRandomUUID()).setSceneId(taskEntity.getSceneId())
                             .setAbnormalTimeDescription(jsonObject.getString("phrases")).setAbnormalType(MultiSimulationResultTypeEnum.LAST_DESCRIPTION.getResultType());
                         multiSimulationResultMapper.insertProjectResult(multiSimulationProjectResultPO);
-                        // TODO 生成仿真视频url
+                        String urlMp4Pub = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                                .method(Method.GET)
+                                .bucket(bucketName)
+                                .object(allMp4Url)
+                                .build())
+                            .replace(minioConfiguration.getEndpointPrivate(), minioConfiguration.getEndpointPublic());
+                        String simUrlMp4Pub = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                                .method(Method.GET)
+                                .bucket(bucketName)
+                                .object(simulationMp4Url)
+                                .build())
+                            .replace(minioConfiguration.getEndpointPrivate(), minioConfiguration.getEndpointPublic());
+                        String csvUrlPub = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+                                .method(Method.GET)
+                                .bucket(bucketName)
+                                .object(minioPathCsv)
+                                .build())
+                            .replace(minioConfiguration.getEndpointPrivate(), minioConfiguration.getEndpointPublic());
+                        multiSimulationSceneMapper.updateSceneResultById(csvUrlPub, urlMp4Pub, simUrlMp4Pub, taskEntity.getSceneId());
 
                     } else {
                         log.info("taskId:{}未找到csv文件", taskId);
                     }
+                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.COMPLETED_STATUS.getProjectStatus(), taskEntity.getId(), 0);
+                } else if (DictConstants.TASK_ABORTED.equals(state)) {
+                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.AUTO_TERMINATED_STATUS.getProjectStatus(), taskEntity.getId(), 0);
+                } else if (DictConstants.TASK_TERMINATED.equals(state)) {
+                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationTaskStatusEnum.TERMINATED_STATUS.getProjectStatus(), taskEntity.getId(), 0);
                 } else {
                     // 终止
-                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationStatusEnum.TERMINATED_STATUS.getProjectStatus(), taskEntity.getId(), 0);
-                    log.info("taskId:{},项目已经停止", taskId);
+                    log.info("未知的反馈状态类型projectId:{},taskId:{},state:{}", projectId, taskId, state);
+                    return;
+//                    taskRecordMapper.updateMultiSimulationProjectTaskRecordStatus(MultiSimulationStatusEnum.TERMINATED_STATUS.getProjectStatus(), taskEntity.getId(), 0);
+//                    log.info("taskId:{},项目已经停止", taskId);
                 }
             }
             List<MultiSimulationProjectTaskRecordPO> recordPOList = multiTaskRecordMapper.selectMultiSimulationProjectTaskRecordList(projectId);
@@ -335,7 +370,7 @@ public class TaskApplicationService {
                 //7 删除项目临时文件
                 FileUtil.rm(linuxTempPath + "multiProject/" + projectId + "/");
                 // 删除minio临时文件
-//                MinioUtil.rmR(minioClient, bucketName, projectResultPathOfMinio + projectId + "/");
+                MinioUtil.rmR(minioClient, bucketName, projectResultPathOfMinio + projectId + "/");
                 // 删除算法key
                 // 删除yaml路径redis
                 // 删除记录podNamekey
@@ -355,9 +390,41 @@ public class TaskApplicationService {
         return taskDomainService.taskConfirm(taskId);
     }
 
+    public Boolean multiConfirm(String taskId) {
+        MultiSimulationProjectTaskRecordPO multiSimulationProjectTaskRecordPO = multiTaskRecordMapper.selectMultiSimulationProjectTaskRecordById(taskId);
+        if (Objects.isNull(multiSimulationProjectTaskRecordPO)){
+            return false;
+        }
+        Integer status = multiSimulationProjectTaskRecordPO.getStatus();
+        if (status == MultiSimulationTaskStatusEnum.TERMINATED_STATUS.getProjectStatus() ||
+            status == MultiSimulationTaskStatusEnum.COMPLETED_STATUS.getProjectStatus() ||
+            status == MultiSimulationTaskStatusEnum.AUTO_TERMINATED_STATUS.getProjectStatus() ||
+            status == MultiSimulationTaskStatusEnum.NEED_ANALYSIS_STATUS.getProjectStatus() ||
+            status == MultiSimulationTaskStatusEnum.TERMINATED_STATUS.getProjectStatus()){
+            return false;
+        }
+
+        if (status == MultiSimulationTaskStatusEnum.RUN_STATUS.getProjectStatus() || status == MultiSimulationTaskStatusEnum.INIT_STATUS.getProjectStatus()){
+            return true;
+        }
+        return false;
+    }
+
     public void tick(String taskId) {
         taskDomainService.taskTick(taskId);
     }
+
+    public void multiTick(String taskId) {
+        log.info("多模式仿真收到任务 " + taskId + " 的心跳。");
+        MultiSimulationProjectTaskRecordPO taskRecordPO = multiTaskRecordMapper.selectMultiSimulationProjectTaskRecordById(taskId);
+        if (taskRecordPO == null) {
+            return;
+        }
+        String projectId = taskRecordPO.getProjectId();
+        // 刷新 redis 心跳时间
+        String multiTaskTickPodRedisKey = taskDomainService.getMultiTaskTickPodRedisKey(taskId, projectId);
+        stringRedisTemplate.opsForValue().set(multiTaskTickPodRedisKey, TimeUtil.getNowString());
+    }
 }
 
 

+ 9 - 6
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/domain/service/ProjectDomainService.java

@@ -230,12 +230,15 @@ public class ProjectDomainService {
         podString = podString.replace("minio-ip", minioConfiguration.getEndpointWithoutHttp());
         podString = podString.replace("minio-access-key", minioConfiguration.getAccessKey());
         podString = podString.replace("minio-secret-key", minioConfiguration.getSecretKey());
-        podString = podString.replace("kafka-partition", String.valueOf(kafkaPartition));
-        podString = podString.replace("kafka-offset", String.valueOf(kafkaOffset));
-        podString = podString.replace("cpu-order", "1");
+        podString = podString.replace("kafka-partition", "\"" + kafkaPartition + "\"");
+        podString = podString.replace("kafka-offset", "\"" + kafkaOffset + "\"");
+        podString = podString.replace("cpu-order", "\""+1+"\"");
+        podString = podString.replace("vtd-command", "docker_cloud_multiV.ini");
+        podString = podString.replace("kafka-topic", projectId);
+
         List<MultiSimulationSceneCarVO> simulationSceneCarVOList = multiSimulationSceneKafkaParam.getSimulationSceneCarVOList();
 
-        podString = podString.replace("num-of-vehicle", String.valueOf(simulationSceneCarVOList.size()));
+        podString = podString.replace("num-of-vehicle", "\"" + simulationSceneCarVOList.size() + "\"");
         int cameraVehicleId = 0;
         for (int i = 0; i < simulationSceneCarVOList.size(); i++) {
             Integer isSimulationCar = simulationSceneCarVOList.get(i).getIsSimulationCar();
@@ -243,7 +246,7 @@ public class ProjectDomainService {
                 cameraVehicleId = i + 1;
             }
         }
-        podString = podString.replace("camera-vehicle-id", String.valueOf(cameraVehicleId));
+        podString = podString.replace("camera-vehicle-id", "\"" + cameraVehicleId + "\"");
 
         StringBuffer stringBuffer = new StringBuffer();
         StringBuffer stringBufferInit = new StringBuffer();
@@ -255,7 +258,7 @@ public class ProjectDomainService {
             String algorithmImage = customRedisClient.get(getMultiAlgorithmIdRedisKey(algorithmId, projectId));
             temp = temp.replace("algorithm-image", algorithmImage);
             temp = temp.replace("ros-master-uri", "http://localhost:" + String.valueOf(basePort + i + 1));
-            temp = temp.replace("vehicle-id", String.valueOf(i+1));
+            temp = temp.replace("vehicle-id", "\"" + String.valueOf(i+1) + "\"");
             String pathEnd = car.getPathEnd();
             JSONObject object = JSONObject.parseObject(pathEnd);
             temp = temp.replace("end-coord", String.valueOf(object.get("x")) + "," + String.valueOf(object.get("y")));

+ 7 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/domain/service/TaskDomainService.java

@@ -420,6 +420,13 @@ public class TaskDomainService {
 
     }
 
+    /**
+     * 多模式仿真任务刷新心跳的时间redisKey
+     */
+    public String getMultiTaskTickPodRedisKey(String taskId, String projectId){
+        return "multi_project:" + projectId + ":taskId:" + taskId + ":taskTickPod";
+    }
+
 
     @SneakyThrows
     public void done(PrefixEntity redisPrefix, String projectId, String projectType) {

+ 1 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/configuration/kubernetes/KubernetesConfiguration.java

@@ -9,6 +9,7 @@ import lombok.SneakyThrows;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.util.ResourceUtils;
 
 import java.io.File;
 import java.io.FileReader;

+ 4 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/configuration/minio/MinioConfiguration.java

@@ -11,6 +11,10 @@ import org.springframework.context.annotation.Configuration;
 @ConfigurationProperties(prefix = "minio")
 public class MinioConfiguration {
     private String endpoint;
+
+    private String endpointPrivate;
+
+    private String endpointPublic;
     private String endpointWithoutHttp;
     private String accessKey;
     private String secretKey;

+ 1 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/db/mysql/mapper/MultiSimulationProjectTaskRecordMapper.java

@@ -38,4 +38,5 @@ public interface MultiSimulationProjectTaskRecordMapper {
     int deleteProjectByProjectId(@Param("projectId") String projectId);
 
 
+
 }

+ 6 - 6
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/infra/db/mysql/mapper/MultiSimulationSceneMapper.java

@@ -1,13 +1,13 @@
 package com.css.simulation.resource.scheduler.infra.db.mysql.mapper;
 
-import api.common.pojo.param.project.MultiSimulationSceneParam;
-import api.common.pojo.po.project.MultiSimulationScenePO;
-import api.common.pojo.vo.project.MultiSimulationSceneVO;
-import org.apache.ibatis.annotations.*;
-
-import java.util.List;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
 
 @Mapper
 public interface MultiSimulationSceneMapper {
 
+    @Update("update multi_simulation_scene set project_result_csv_url = #{projectResultCsvUrl}, project_result_overall_url = #{projectResultOverallUrl}, project_result_simulation_url = #{projectResultSimulationUrl} where id = #{sceneId}")
+    int updateSceneResultById(@Param("projectResultCsvUrl") String projectResultCsvUrl, @Param("projectResultOverallUrl") String projectResultOverallUrl,
+                              @Param("projectResultSimulationUrl") String projectResultSimulationUrl, @Param("sceneId") String sceneId);
 }