martin 2 éve
szülő
commit
e22a90463f

+ 0 - 7
simulation-resource-scheduler/pom.xml

@@ -141,13 +141,6 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
-
-<!--        <dependency>-->
-<!--            <groupId>junit</groupId>-->
-<!--            <artifactId>junit</artifactId>-->
-<!--            <version>4.13.2</version>-->
-<!--            <scope>test</scope>-->
-<!--        </dependency>-->
     </dependencies>
     <build>
         <plugins>

+ 13 - 4
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/consumer/ProjectConsumer.java

@@ -100,12 +100,17 @@ public class ProjectConsumer {
         }
         //3 获取用户类型(管理员账户、管理员子账户、普通账户、普通子账户)(独占、共享)
         UserPO userPO = userMapper.selectById(userId);
+        log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人为:" + userPO);
         String roleCode = userPO.getRoleCode();
         String useType = userPO.getUseType();
         ClusterPO clusterPO;
         if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) {  //3-1 管理员账户和管理员子账户直接执行
+            log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为管理员账户或管理员子账户,直接执行!");
             PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(DictConstants.SYSTEM_CLUSTER_ID, projectId);
-            run(DictConstants.SYSTEM_CLUSTER_ID, projectId, projectType, redisPrefix.getProjectRunningKey(), projectJson, parallelism);
+            boolean run = run(DictConstants.SYSTEM_CLUSTER_ID, projectId, projectType, redisPrefix.getProjectRunningKey(), projectJson, parallelism);
+            if (!run) {
+                wait(DictConstants.SYSTEM_CLUSTER_ID, projectId, redisPrefix.getProjectWaitingKey(), projectJson);
+            }
             return;
         } else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
             clusterPO = clusterMapper.selectByUserId(userId);
@@ -117,7 +122,7 @@ public class ProjectConsumer {
                 clusterPO = clusterMapper.selectByUserId(parentUserId);
             }
         } else {
-            log.error("ProjectConsumer--cacheManualProject 未知账户类型,不予执行:" + projectJson);
+            log.error("ProjectConsumer--dispatchProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
             return;
         }
         // 获取拥有的节点数量,即仿真软件证书数量
@@ -151,10 +156,10 @@ public class ProjectConsumer {
         }
     }
 
-    public void run(String clusterId, String projectId, String projectType, String projectRunningKey, String projectJson, long parallelism) {
+    public boolean run(String clusterId, String projectId, String projectType, String projectRunningKey, String projectJson, long parallelism) {
 
         //1 获取一个剩余可用并行度最大的节点
-        KubernetesNodeTO maxParallelismPNodeTO = projectUtil.getMaxParallelismPNode();
+        KubernetesNodeTO maxParallelismPNodeTO = projectUtil.getMaxParallelismNode();
         String maxRestParallelismNode = maxParallelismPNodeTO.getName();
         Long maxRestParallelism = maxParallelismPNodeTO.getMaxParallelism();
 
@@ -162,9 +167,13 @@ public class ProjectConsumer {
         if (maxRestParallelism > parallelism) {
             log.info("ProjectConsumer--run 集群 " + clusterId + " 将项目 " + projectId + "在节点" + maxRestParallelismNode + " 执行!");
             parseProject(projectId, projectType, projectJson, "cluster:" + clusterId, projectRunningKey, maxRestParallelismNode, parallelism);
+            return true;
         } else if (maxRestParallelism > 0) {
             log.info("ProjectConsumer--run 集群 " + clusterId + " 将项目 " + projectId + "在节点" + maxRestParallelismNode + " 执行!");
             parseProject(projectId, projectType, projectJson, "cluster:" + clusterId, projectRunningKey, maxRestParallelismNode, maxRestParallelism);
+            return true;
+        } else {
+            return false;
         }
     }
 

+ 38 - 5
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/scheduler/ProjectScheduler.java

@@ -11,6 +11,7 @@ import com.css.simulation.resource.scheduler.mapper.*;
 import com.css.simulation.resource.scheduler.pojo.po.ClusterPO;
 import com.css.simulation.resource.scheduler.pojo.po.ProjectPO;
 import com.css.simulation.resource.scheduler.pojo.po.TaskPO;
+import com.css.simulation.resource.scheduler.pojo.po.UserPO;
 import com.css.simulation.resource.scheduler.pojo.to.KubernetesNodeTO;
 import com.css.simulation.resource.scheduler.pojo.to.PrefixTO;
 import com.css.simulation.resource.scheduler.service.TaskService;
@@ -60,6 +61,8 @@ public class ProjectScheduler {
     ProjectConsumer projectConsumer;
     @Resource
     ProjectUtil projectUtil;
+    @Resource
+    UserMapper userMapper;
 
 
     /**
@@ -82,18 +85,48 @@ public class ProjectScheduler {
             String projectType = project.getProjectType();
             long parallelism = Long.parseLong(project.getParallelism());
             String userId = project.getCreateUserId();
-            ClusterPO clusterPO = clusterMapper.selectByUserId(userId);
-            if (clusterPO == null) {
-                log.error("ProjectScheduler--dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
+            UserPO userPO = userMapper.selectById(userId);
+            String roleCode = userPO.getRoleCode();
+            String useType = userPO.getUseType();
+            ClusterPO clusterPO = null;
+            String clusterId;
+            boolean isSystem = false;
+            if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) {  //3-1 管理员账户和管理员子账户直接执行
+                clusterId = DictConstants.SYSTEM_CLUSTER_ID;
+                isSystem = true;
+            } else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
+                clusterPO = clusterMapper.selectByUserId(userId);
+                if (clusterPO == null) {
+                    log.error("ProjectScheduler--dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
+                    return;
+                }
+                clusterId = clusterPO.getId();
+            } else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
+                if (DictConstants.USE_TYPE_EXCLUSIVE.equals(useType)) {   //3-3 普通子账户,根据自己的独占节点排队
+                    clusterPO = clusterMapper.selectByUserId(userId);
+                } else {    //3-4 共享子账户,根据父账户的共享节点排队
+                    String parentUserId = userPO.getCreateUserId();
+                    clusterPO = clusterMapper.selectByUserId(parentUserId);
+                }
+                if (clusterPO == null) {
+                    log.error("ProjectScheduler--dispatchProject 项目 " + projectId + " 的创建用户 " + userId + " 没有分配集群!");
+                    return;
+                }
+                clusterId = clusterPO.getId();
+            } else {
+                log.error("ProjectConsumer--dispatchProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
                 return;
             }
-            String clusterId = clusterPO.getId();
             PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(clusterId, projectId);
             // --------------------------------  判断项目是否已经在执行,如果执行则 continue --------------------------------
             if (StringUtil.isNotEmpty(stringRedisTemplate.opsForValue().get(redisPrefix.getProjectRunningKey()))) {
                 continue;
             }
             // -------------------------------- 项目没有执行说明等待中 --------------------------------
+            if (isSystem) { // 系统管理员直接执行
+                run(clusterId, projectId, projectType, redisPrefix.getProjectWaitingKey(), redisPrefix.getProjectRunningKey(), parallelism);
+                return;
+            }
             int simulationLicenseNumber = clusterPO.getNumSimulationLicense();
             // 获取该用户正在运行的项目数量
             Set<String> clusterRunningKeySet = stringRedisTemplate.keys(redisPrefix.getClusterRunningPrefix() + "*");
@@ -129,7 +162,7 @@ public class ProjectScheduler {
             return;
         }
         //1 获取一个剩余可用并行度最大的节点
-        KubernetesNodeTO maxParallelismPNodeTO = projectUtil.getMaxParallelismPNode();
+        KubernetesNodeTO maxParallelismPNodeTO = projectUtil.getMaxParallelismNode();
         String maxRestParallelismNode = maxParallelismPNodeTO.getName();
         Long maxRestParallelism = maxParallelismPNodeTO.getMaxParallelism();
 

+ 1 - 1
simulation-resource-scheduler/src/main/java/com/css/simulation/resource/scheduler/util/ProjectUtil.java

@@ -44,7 +44,7 @@ public class ProjectUtil {
     StringRedisTemplate stringRedisTemplate;
 
 
-    public KubernetesNodeTO getMaxParallelismPNode() {
+    public KubernetesNodeTO getMaxParallelismNode() {
         List<KubernetesNodeTO> nodeList = kubernetesConfiguration.getNodeList();
         String maxRestParallelismNode = "master";
         long maxRestParallelism = 0L;

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

@@ -6,4 +6,4 @@ spring:
   application:
     name: simulation-resource-scheduler
   profiles:
-    active: dev
+    active: test