martin 3 лет назад
Родитель
Сommit
7298fde293

+ 3 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/configuration/kubernetes/KubernetesConfiguration.java

@@ -5,6 +5,7 @@ import io.kubernetes.client.util.ClientBuilder;
 import io.kubernetes.client.util.KubeConfig;
 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;
@@ -15,9 +16,9 @@ public class KubernetesConfiguration {
 
     @Bean
     public ApiClient apiClient() throws IOException {
-//        File config = ResourceUtils.getFile("classpath:kubernetes/config");  // 开发环境可用,生产环境不行,无法从jar 包读取
+        File config = ResourceUtils.getFile("classpath:kubernetes/config");  // 开发环境可用,生产环境不行,无法从jar 包读取
 //        File config = new File("D:\\idea-project\\simulation-cloud\\simulation-resource-scheduler\\src\\main\\resources\\kubernetes\\config");  //windows
-        File config = new File("/root/.kube/config");   //linux
+//        File config = new File("/root/.kube/config");   //linux
 //
 //        ClassPathResource classPathResource = new ClassPathResource("kubernetes/config");
 //        InputStream inputStream = classPathResource.getInputStream();

+ 2 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/mapper/IndexTemplateMapper.java

@@ -23,6 +23,7 @@ public interface IndexTemplateMapper {
             @Result(column = "weight", property = "weight", jdbcType = JdbcType.VARCHAR),
             @Result(column = "parent_id", property = "parentId", jdbcType = JdbcType.VARCHAR),
             @Result(column = "root_id", property = "rootId", jdbcType = JdbcType.VARCHAR),
+            @Result(column = "package_level", property = "packageLevel", jdbcType = JdbcType.VARCHAR),
             @Result(column = "rule_name", property = "ruleName", jdbcType = JdbcType.VARCHAR),
             @Result(column = "rule_details", property = "ruleDetails", jdbcType = JdbcType.VARCHAR)
     })
@@ -43,6 +44,7 @@ public interface IndexTemplateMapper {
             "       sps.weight,\n" +
             "       sps.parent_id,\n" +
             "       sps.root_id,\n" +
+            "       sps.package_level,\n" +
             "       sr.rule_name,\n" +
             "       sr.rule_details\n" +
             "from scene_package_sublist sps\n" +

+ 1 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/pojo/po/IndexTemplatePO.java

@@ -21,6 +21,7 @@ public class IndexTemplatePO {
     private String ruleName; // 打分规则名称,例如 AEB_1-1
     private String ruleDetails; // 打分规则代码
     private Double tempScore;
+    private Integer packageLevel; // 指标等级
 
 
 }

+ 3 - 2
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/pojo/po/TaskIndexPO.java

@@ -18,6 +18,7 @@ public class TaskIndexPO extends CommonPO {
     private String target;
     private Integer notStandardSceneNum;
     private Double score; // 得分
-    private String weight; // 得分
-    private String scoreExplain; // 得分
+    private String weight; // 权重
+    private String scoreExplain; // 得分说明
+    private Integer packageLevel; // 指标等级
 }

+ 1 - 0
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/scheduler/TickScheduler.java

@@ -61,6 +61,7 @@ public class TickScheduler {
 
     /**
      * 解决 pod 莫名奇妙关闭的问题
+     *
      * @throws ApiException 异常
      */
     @Scheduled(fixedDelay = 60 * 1000)

+ 1 - 3
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/AlgorithmService.java

@@ -40,9 +40,7 @@ public class AlgorithmService {
         //3 获取文件列表中是否有 docker-entrypoint.sh
         boolean result = false;
         for (String path : pathList) {
-            if (
-                    path.contains(".dockerenv")
-            ) {
+            if (path.contains(".dockerenv")) {
                 result = true;
                 break;
             }

+ 33 - 19
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/service/TaskService.java

@@ -191,6 +191,7 @@ public class TaskService {
         taskIndexMapper.deleteLastByProjectId(projectId);
         // -------------------------------- 查询叶子指标 --------------------------------
         List<IndexTemplatePO> leafIndexTemplateList = indexTemplateMapper.selectLeafIndexWithRuleDetailsByPackageId(scenePackageId);
+        int maxLevel = 1; // 用于计算指标得分
         List<TaskIndexPO> leafTaskIndexList = new ArrayList<>();
         log.info("TaskService--state 共有 " + leafIndexTemplateList.size() + "个叶子节点!");
 
@@ -203,6 +204,10 @@ public class TaskService {
             String parentId = indexTemplatePO.getParentId();
             String rootId = indexTemplatePO.getRootId();
             String weight = indexTemplatePO.getWeight();
+            Integer packageLevel = indexTemplatePO.getPackageLevel();
+            if (packageLevel > maxLevel) {
+                maxLevel = packageLevel;
+            }
             log.info("TaskService--state 开始执行对第 " + (i + 1) + " 个叶子节点 " + indexId + " 进行打分!");
             String ruleName = indexTemplatePO.getRuleName();    // 打分脚本名称,例如 AEB_1-1
             String ruleDetails = indexTemplatePO.getRuleDetails();    // 打分脚本内容
@@ -291,6 +296,7 @@ public class TaskService {
             double leafIndexScore = resultNumberOfCurrentIndex == 0 ? 0 : NumberUtil.cut(leafSum / resultNumberOfCurrentIndex, 2);
             // -------------------------------- 保存叶子指标得分 --------------------------------
             indexTemplatePO.setTempScore(leafIndexScore);
+
             TaskIndexPO leafTaskIndex = TaskIndexPO.builder()
                     .id(StringUtil.getRandomUUID())
                     .pId(projectId)
@@ -302,6 +308,7 @@ public class TaskService {
                     .rootId(rootId)
                     .weight(weight)
                     .scoreExplain(scoreExplain.get())
+                    .packageLevel(packageLevel)
                     .build();
             leafTaskIndex.setCreateUserId(USER_ID);
             leafTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
@@ -318,7 +325,7 @@ public class TaskService {
         // 保存一级指标分数
         log.info("TaskService--state 项目 " + projectId + " 的所有任务分数为:" + taskList);
         log.info("TaskService--state 根据每个指标的得分和权重算出各个一级指标的得分(即 project 对应的场景测试包下的一级指标)!");
-        computeFirst(leafTaskIndexList, projectId);
+        computeFirst(leafTaskIndexList, projectId, maxLevel);
 
         // 调用 server 的接口,计算评价等级
         String tokenUrl = tokenUri + "?grant_type=client_credentials"
@@ -345,22 +352,14 @@ public class TaskService {
     }
 
 
-    public Boolean taskConfirm(String taskId) {
-        // 查询 task 如果不是 pending 则不执行
-        String state = taskMapper.selectStateById(taskId);
-        return DictConstants.TASK_PENDING.equals(state);
-    }
-
-
-    public void computeFirst(List<TaskIndexPO> leafTaskIndexList, String projectId) {
+    public void computeFirst(List<TaskIndexPO> leafTaskIndexList, String projectId, int maxLevel) {
 
         log.info("------- /state computeFirst 计算父指标得分:" + leafTaskIndexList);
         Iterator<TaskIndexPO> leafTaskIndexIterator = leafTaskIndexList.iterator();
+        // 把 1 级的指标得分直接保存
         while (leafTaskIndexIterator.hasNext()) {
             TaskIndexPO leafTaskIndex = leafTaskIndexIterator.next();
-            String parentId = leafTaskIndex.getParentId();
-            String rootId = leafTaskIndex.getRootId();
-            if (parentId.equals(rootId)) {
+            if (leafTaskIndex.getPackageLevel() == 1) {
                 leafTaskIndex.setCreateUserId(USER_ID);
                 leafTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
                 leafTaskIndex.setModifyUserId(USER_ID);
@@ -369,37 +368,51 @@ public class TaskService {
                 taskIndexMapper.insertFirstIndex(leafTaskIndex);
                 leafTaskIndexIterator.remove();
             }
-
         }
         if (leafTaskIndexList.size() > 0) {
-            Map<String, List<TaskIndexPO>> sonTaskIndexMap = leafTaskIndexList.stream().collect(Collectors.groupingBy(TaskIndexPO::getParentId));
+
+            List<TaskIndexPO> nextLevelIndexList = new ArrayList<>();
+            // 找出等级和 maxLevel 不相同的指标暂时不计算
+            leafTaskIndexList.stream()
+                    .filter(po -> maxLevel != po.getPackageLevel())
+                    .forEach(nextLevelIndexList::add);
+            // 找出等级和 maxLevel 相同的指标并根据父指标分组
+            Map<String, List<TaskIndexPO>> sonTaskIndexMap = leafTaskIndexList.stream()
+                    .filter(po -> maxLevel == po.getPackageLevel())
+                    .collect(Collectors.groupingBy(TaskIndexPO::getParentId));
             Set<String> parentIdSet = sonTaskIndexMap.keySet();
             List<String> parentIdList = CollectionUtil.setToList(parentIdSet);
             List<IndexTemplatePO> parentIndexTemplateList = indexTemplateMapper.selectByIdList(parentIdList);
             // 计算父指标得分
-            List<TaskIndexPO> parentIndexList = new ArrayList<>();
             parentIndexTemplateList.forEach(indexTemplate -> {
                 String weight = indexTemplate.getWeight();
-
                 List<TaskIndexPO> sonTaskIndexList = sonTaskIndexMap.get(indexTemplate.getIndexId());
                 double parentScore = sonTaskIndexList.stream().mapToDouble(taskIndex -> taskIndex.getScore() * Double.parseDouble(taskIndex.getWeight()) / 100).sum();
                 TaskIndexPO parentTaskIndex = TaskIndexPO.builder()
                         .id(StringUtil.getRandomUUID())
                         .pId(projectId)
                         .target(indexTemplate.getIndexId())
-                        .score(((int) parentScore * 100) / 100.0)
+                        .score(parentScore)
                         .indexId(indexTemplate.getIndexId())
                         .parentId(indexTemplate.getParentId())
                         .rootId(indexTemplate.getRootId())
                         .weight(weight)
+                        .packageLevel(maxLevel - 1)
                         .build();
-                parentIndexList.add(parentTaskIndex);
+                nextLevelIndexList.add(parentTaskIndex);
             });
             // 将父指标作为叶子指标递归
-            computeFirst(parentIndexList, projectId);
+            computeFirst(nextLevelIndexList, projectId, maxLevel - 1);
         }
     }
 
+
+    public Boolean taskConfirm(String taskId) {
+        // 查询 task 如果不是 pending 则不执行
+        String state = taskMapper.selectStateById(taskId);
+        return DictConstants.TASK_PENDING.equals(state);
+    }
+
     public void taskTick(String taskId) {
         log.info("TaskService--taskTick 任务 " + taskId + "心跳!");
         // 刷新 redis 心跳时间
@@ -408,6 +421,7 @@ public class TaskService {
         redisTemplate.opsForValue().set(manualProjectTopic + ":" + projectId + ":" + taskId, TimeUtil.getNowString());
     }
 
+
 }
 
 

+ 2 - 2
simulation-resource-scheduler/src/main/resources/bootstrap-dev.yaml

@@ -2,9 +2,9 @@ spring:
   cloud:
     nacos:
       discovery:
-        server-addr: 10.12.10.70:8848
+        server-addr: 47.94.105.148:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
       config:
-        server-addr: 10.12.10.70:8848
+        server-addr: 47.94.105.148:8848
         namespace: 3698bfc2-a612-487a-b2a2-aaad16cd9d9d
         file-extension: yaml

+ 100 - 36
simulation-resource-scheduler/src/test/java/com/css/simulation/resource/scheduler/SchedulerTest.java

@@ -44,69 +44,126 @@ public class SchedulerTest {
 
     @Test
     public void redisTemplate() throws ApiException {
-        redisTemplate.opsForValue().set("a:b","test");
-        redisTemplate.opsForValue().set("a:b:c","test");
+        redisTemplate.opsForValue().set("a:b", "test");
+        redisTemplate.opsForValue().set("a:b:c", "test");
     }
 
     @Test
-    public void test() {
+    public void compute() {
+
+        /*
+TaskIndexPO(id=0a8cd6c061a24ed2bbb36a45b3a003d4,
+         pId=e8337795555541639659d773e28eafd5,
+          indexId=433838e404a74f87ba8f78c617134eec,
+           parentId=018ae110ca51413ba22268f36c125a03,
+            rootId=018ae110ca51413ba22268f36c125a03,
+             target=433838e404a74f87ba8f78c617134eec,
+              notStandardSceneNum=0, score=100.0, weight=40,
+               scoreExplain=1) 未发生碰撞>,得分 100;2) 发生碰撞,得分 0。),
+
+TaskIndexPO(id=24a53877c1b34b3bb61dc9d7e28035d2,
+                 pId=e8337795555541639659d773e28eafd5,
+                 indexId=a2a1866e5c7047c3bddc905971540043,
+                 parentId=148c7e1fb6474cdf8c106215f92b0d9d,
+                 rootId=018ae110ca51413ba22268f36c125a03,
+                 target=a2a1866e5c7047c3bddc905971540043,
+                 notStandardSceneNum=1,
+                 score=0.0,
+                  weight=70, scoreExplain=1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。),
+
+TaskIndexPO(id=94a9225873534e97be79b25c98861b83,
+      pId=e8337795555541639659d773e28eafd5,
+      indexId=df913a81a34742808cefc76829bfa398,
+       parentId=e28c9687cfdd4fec956d4c3a7fa061ec,
+        rootId=018ae110ca51413ba22268f36c125a03,
+         target=df913a81a34742808cefc76829bfa398,
+         notStandardSceneNum=0, score=100.0, weight=60, scoreExplain=1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。),
+
+TaskIndexPO(id=14d0017b489844bcb33118f7cfeee04c,
+         pId=e8337795555541639659d773e28eafd5,
+          indexId=eefbf9234bad410b801ed860b4add56f,
+           parentId=e28c9687cfdd4fec956d4c3a7fa061ec,
+            rootId=018ae110ca51413ba22268f36c125a03,
+            target=eefbf9234bad410b801ed860b4add56f,
+            notStandardSceneNum=1, score=0.0, weight=40, scoreExplain=1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)]
+         */
 
 
         List<TaskIndexPO> leafTaskIndexList = new ArrayList<>();
+
         TaskIndexPO taskIndexPO1 = TaskIndexPO.builder()
-                .id("9e64a4aa3df7414097ffd1c82a8bdaa3")
-                .pId("7586e4196699414d87f63ffbbf281122")
-                .indexId("12db82c7acbf49a6a9274243e7eebc6a")
-                .parentId("046155104e934910b19305a6ba27a784")
-                .rootId("059c582c7cf3422b8d9bb8583f6b7c5a")
-                .target("12db82c7acbf49a6a9274243e7eebc6a")
+                .id("0a8cd6c061a24ed2bbb36a45b3a003d4")
+                .pId("e8337795555541639659d773e28eafd5")
+                .indexId("433838e404a74f87ba8f78c617134eec")
+                .parentId("018ae110ca51413ba22268f36c125a03")
+                .rootId("018ae110ca51413ba22268f36c125a03")
+                .target("433838e404a74f87ba8f78c617134eec")
                 .notStandardSceneNum(0)
                 .score(100.0)
-                .weight("50")
+                .weight("40")
                 .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .packageLevel(1)
                 .build();
         leafTaskIndexList.add(taskIndexPO1);
 
         TaskIndexPO taskIndexPO2 = TaskIndexPO.builder()
-                .id("fc16c0aa3292496fb37daa635dd2d506")
-                .pId("7586e4196699414d87f63ffbbf281122")
-                .indexId("393a4b959d684eec9b5b777c8fc38bcf")
-                .parentId("046155104e934910b19305a6ba27a784")
-                .rootId("059c582c7cf3422b8d9bb8583f6b7c5a")
-                .target("393a4b959d684eec9b5b777c8fc38bcf")
-                .notStandardSceneNum(0)
-                .score(100.0)
-                .weight("50")
+                .id("24a53877c1b34b3bb61dc9d7e28035d2")
+                .pId("e8337795555541639659d773e28eafd5")
+                .indexId("a2a1866e5c7047c3bddc905971540043")
+                .parentId("148c7e1fb6474cdf8c106215f92b0d9d")
+                .rootId("018ae110ca51413ba22268f36c125a03")
+                .target("a2a1866e5c7047c3bddc905971540043")
+                .notStandardSceneNum(1)
+                .score(0.0)
+                .weight("70")
                 .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .packageLevel(2)
                 .build();
         leafTaskIndexList.add(taskIndexPO2);
 
         TaskIndexPO taskIndexPO3 = TaskIndexPO.builder()
-                .id("300fbafab2d3432aac2b7926bb89456a")
-                .pId("7586e4196699414d87f63ffbbf281122")
-                .indexId("5b95a89d5a764af0ad93164753ab8caa")
-                .parentId("059c582c7cf3422b8d9bb8583f6b7c5a")
-                .rootId("059c582c7cf3422b8d9bb8583f6b7c5a")
-                .target("5b95a89d5a764af0ad93164753ab8caa")
+                .id("94a9225873534e97be79b25c98861b83")
+                .pId("e8337795555541639659d773e28eafd5")
+                .indexId("df913a81a34742808cefc76829bfa398")
+                .parentId("e28c9687cfdd4fec956d4c3a7fa061ec")
+                .rootId("018ae110ca51413ba22268f36c125a03")
+                .target("df913a81a34742808cefc76829bfa398")
                 .notStandardSceneNum(0)
                 .score(100.0)
                 .weight("60")
                 .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .packageLevel(3)
                 .build();
         leafTaskIndexList.add(taskIndexPO3);
 
-        computeFirst(leafTaskIndexList, "7586e4196699414d87f63ffbbf281122");
+
+        TaskIndexPO taskIndexPO4 = TaskIndexPO.builder()
+                .id("14d0017b489844bcb33118f7cfeee04c")
+                .pId("e8337795555541639659d773e28eafd5")
+                .indexId("eefbf9234bad410b801ed860b4add56f")
+                .parentId("e28c9687cfdd4fec956d4c3a7fa061ec")
+                .rootId("018ae110ca51413ba22268f36c125a03")
+                .target("eefbf9234bad410b801ed860b4add56f")
+                .notStandardSceneNum(1)
+                .score(0.0)
+                .weight("40")
+                .scoreExplain("1) 未发生碰撞,得分 100;2) 发生碰撞,得分 0。)")
+                .packageLevel(3)
+                .build();
+        leafTaskIndexList.add(taskIndexPO4);
+
+
+        computeFirst(leafTaskIndexList, "e8337795555541639659d773e28eafd5", 3);
     }
 
-    public void computeFirst(List<TaskIndexPO> leafTaskIndexList, String projectId) {
+    public void computeFirst(List<TaskIndexPO> leafTaskIndexList, String projectId, int maxLevel) {
 
         log.info("------- /state computeFirst 计算父指标得分:" + leafTaskIndexList);
         Iterator<TaskIndexPO> leafTaskIndexIterator = leafTaskIndexList.iterator();
+        // 把 1 级的指标得分直接保存
         while (leafTaskIndexIterator.hasNext()) {
             TaskIndexPO leafTaskIndex = leafTaskIndexIterator.next();
-            String parentId = leafTaskIndex.getParentId();
-            String rootId = leafTaskIndex.getRootId();
-            if (parentId.equals(rootId)) {
+            if (leafTaskIndex.getPackageLevel() == 1) {
                 leafTaskIndex.setCreateUserId(USER_ID);
                 leafTaskIndex.setCreateTime(TimeUtil.getNowForMysql());
                 leafTaskIndex.setModifyUserId(USER_ID);
@@ -115,18 +172,24 @@ public class SchedulerTest {
                 taskIndexMapper.insertFirstIndex(leafTaskIndex);
                 leafTaskIndexIterator.remove();
             }
-
         }
         if (leafTaskIndexList.size() > 0) {
-            Map<String, List<TaskIndexPO>> sonTaskIndexMap = leafTaskIndexList.stream().collect(Collectors.groupingBy(TaskIndexPO::getParentId));
+
+            List<TaskIndexPO> nextLevelIndexList = new ArrayList<>();
+            // 找出等级和 maxLevel 不相同的指标暂时不计算
+            leafTaskIndexList.stream()
+                    .filter(po -> maxLevel != po.getPackageLevel())
+                    .forEach(nextLevelIndexList::add);
+            // 找出等级和 maxLevel 相同的指标并根据父指标分组
+            Map<String, List<TaskIndexPO>> sonTaskIndexMap = leafTaskIndexList.stream()
+                    .filter(po -> maxLevel == po.getPackageLevel())
+                    .collect(Collectors.groupingBy(TaskIndexPO::getParentId));
             Set<String> parentIdSet = sonTaskIndexMap.keySet();
             List<String> parentIdList = CollectionUtil.setToList(parentIdSet);
             List<IndexTemplatePO> parentIndexTemplateList = indexTemplateMapper.selectByIdList(parentIdList);
             // 计算父指标得分
-            List<TaskIndexPO> parentIndexList = new ArrayList<>();
             parentIndexTemplateList.forEach(indexTemplate -> {
                 String weight = indexTemplate.getWeight();
-
                 List<TaskIndexPO> sonTaskIndexList = sonTaskIndexMap.get(indexTemplate.getIndexId());
                 double parentScore = sonTaskIndexList.stream().mapToDouble(taskIndex -> taskIndex.getScore() * Double.parseDouble(taskIndex.getWeight()) / 100).sum();
                 TaskIndexPO parentTaskIndex = TaskIndexPO.builder()
@@ -138,11 +201,12 @@ public class SchedulerTest {
                         .parentId(indexTemplate.getParentId())
                         .rootId(indexTemplate.getRootId())
                         .weight(weight)
+                        .packageLevel(maxLevel - 1)
                         .build();
-                parentIndexList.add(parentTaskIndex);
+                nextLevelIndexList.add(parentTaskIndex);
             });
             // 将父指标作为叶子指标递归
-            computeFirst(parentIndexList, projectId);
+            computeFirst(nextLevelIndexList, projectId, maxLevel - 1);
         }
     }