|
@@ -105,24 +105,24 @@ public class ProjectConsumer {
|
|
String useType = userPO.getUseType();
|
|
String useType = userPO.getUseType();
|
|
ClusterPO clusterPO;
|
|
ClusterPO clusterPO;
|
|
if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) { //3-1 管理员账户和管理员子账户直接执行
|
|
if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) { //3-1 管理员账户和管理员子账户直接执行
|
|
- log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为管理员账户或管理员子账户,直接执行!");
|
|
|
|
|
|
+ log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为管理员账户或管理员子账户,直接判断服务器能否执行。");
|
|
PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(DictConstants.SYSTEM_CLUSTER_ID, projectId);
|
|
PrefixTO redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(DictConstants.SYSTEM_CLUSTER_ID, projectId);
|
|
- boolean run = run(DictConstants.SYSTEM_CLUSTER_ID, projectId, projectType, redisPrefix.getProjectRunningKey(), projectJson, parallelism);
|
|
|
|
- if (!run) {
|
|
|
|
- wait(DictConstants.SYSTEM_CLUSTER_ID, projectId, redisPrefix.getProjectWaitingKey(), projectJson);
|
|
|
|
- }
|
|
|
|
|
|
+ run(DictConstants.SYSTEM_CLUSTER_ID, projectId, projectType, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey(), projectJson, parallelism);
|
|
return;
|
|
return;
|
|
} else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
|
|
} else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
|
|
clusterPO = clusterMapper.selectByUserId(userId);
|
|
clusterPO = clusterMapper.selectByUserId(userId);
|
|
|
|
+ log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通账户(包括独占或共享都在自己的集群),集群为:" + clusterPO);
|
|
} else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
|
|
} else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
|
|
if (DictConstants.USE_TYPE_EXCLUSIVE.equals(useType)) { //3-3 普通子账户,根据自己的独占节点排队
|
|
if (DictConstants.USE_TYPE_EXCLUSIVE.equals(useType)) { //3-3 普通子账户,根据自己的独占节点排队
|
|
clusterPO = clusterMapper.selectByUserId(userId);
|
|
clusterPO = clusterMapper.selectByUserId(userId);
|
|
|
|
+ log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通独占子账户(自己的集群),集群为:" + clusterPO);
|
|
} else { //3-4 共享子账户,根据父账户的共享节点排队
|
|
} else { //3-4 共享子账户,根据父账户的共享节点排队
|
|
String parentUserId = userPO.getCreateUserId();
|
|
String parentUserId = userPO.getCreateUserId();
|
|
clusterPO = clusterMapper.selectByUserId(parentUserId);
|
|
clusterPO = clusterMapper.selectByUserId(parentUserId);
|
|
|
|
+ log.info("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为普通共享子账户(父账户的集群),集群为:" + clusterPO);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- log.error("ProjectConsumer--dispatchProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
|
|
|
|
|
|
+ log.error("ProjectConsumer--cacheManualProject 项目 " + projectId + " 的创建人 " + userId + " 为未知账户类型,不予执行!");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
// 获取拥有的节点数量,即仿真软件证书数量
|
|
// 获取拥有的节点数量,即仿真软件证书数量
|
|
@@ -133,12 +133,12 @@ public class ProjectConsumer {
|
|
Set<String> clusterRunningKeySet = stringRedisTemplate.keys(redisPrefix.getClusterRunningPrefix() + "*");
|
|
Set<String> clusterRunningKeySet = stringRedisTemplate.keys(redisPrefix.getClusterRunningPrefix() + "*");
|
|
List<String> runningProjectSet;
|
|
List<String> runningProjectSet;
|
|
if (CollectionUtil.isEmpty(clusterRunningKeySet)) {
|
|
if (CollectionUtil.isEmpty(clusterRunningKeySet)) {
|
|
- run(clusterId, projectId, projectType, redisPrefix.getProjectRunningKey(), projectJson, parallelism);
|
|
|
|
|
|
+ run(clusterId, projectId, projectType, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey(), projectJson, parallelism);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
runningProjectSet = projectUtil.getRunningProjectList(clusterRunningKeySet);
|
|
runningProjectSet = projectUtil.getRunningProjectList(clusterRunningKeySet);
|
|
if (CollectionUtil.isEmpty(runningProjectSet)) {
|
|
if (CollectionUtil.isEmpty(runningProjectSet)) {
|
|
- run(clusterId, projectId, projectType, redisPrefix.getProjectRunningKey(), projectJson, parallelism);
|
|
|
|
|
|
+ run(clusterId, projectId, projectType, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey(), projectJson, parallelism);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
// 计算正在运行的项目的并行度总和
|
|
// 计算正在运行的项目的并行度总和
|
|
@@ -150,33 +150,48 @@ public class ProjectConsumer {
|
|
}
|
|
}
|
|
// 如果执行后的并行度总和小于最大节点数则执行,否则不执行
|
|
// 如果执行后的并行度总和小于最大节点数则执行,否则不执行
|
|
if (parallelismSum + parallelism <= simulationLicenseNumber) {
|
|
if (parallelismSum + parallelism <= simulationLicenseNumber) {
|
|
- run(clusterId, projectId, projectType, redisPrefix.getProjectRunningKey(), projectJson, parallelism);
|
|
|
|
|
|
+ run(clusterId, projectId, projectType, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey(), projectJson, parallelism);
|
|
} else {
|
|
} else {
|
|
wait(clusterId, projectId, redisPrefix.getProjectWaitingKey(), projectJson);
|
|
wait(clusterId, projectId, redisPrefix.getProjectWaitingKey(), projectJson);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public boolean run(String clusterId, String projectId, String projectType, String projectRunningKey, String projectJson, long parallelism) {
|
|
|
|
|
|
+ /**
|
|
|
|
+ * @param clusterId
|
|
|
|
+ * @param projectId
|
|
|
|
+ * @param projectType
|
|
|
|
+ * @param projectRunningKey
|
|
|
|
+ * @param projectJson
|
|
|
|
+ * @param parallelism
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ public void run(String clusterId, String projectId, String projectType, String projectRunningKey, String projectWaitingKey, String projectJson, long parallelism) {
|
|
|
|
|
|
//1 获取一个剩余可用并行度最大的节点
|
|
//1 获取一个剩余可用并行度最大的节点
|
|
- KubernetesNodeTO maxParallelismPNodeTO = projectUtil.getMaxParallelismNode();
|
|
|
|
- String maxRestParallelismNode = maxParallelismPNodeTO.getName();
|
|
|
|
- Long maxRestParallelism = maxParallelismPNodeTO.getMaxParallelism();
|
|
|
|
|
|
+ KubernetesNodeTO maxParallelismNodeTO = projectUtil.getMaxParallelismNode();
|
|
|
|
+ String maxRestParallelismNode = maxParallelismNodeTO.getName();
|
|
|
|
+ long maxRestParallelism = maxParallelismNodeTO.getMaxParallelism();
|
|
|
|
+ log.info("ProjectConsumer--run 准备在节点 " + maxParallelismNodeTO + " 执行项目 " + projectId + "。");
|
|
|
|
|
|
//2 判断剩余可用并行度是否大于项目并行度,否则加入扩充队列
|
|
//2 判断剩余可用并行度是否大于项目并行度,否则加入扩充队列
|
|
- if (maxRestParallelism > parallelism) {
|
|
|
|
|
|
+ if (maxRestParallelism >= parallelism) {
|
|
log.info("ProjectConsumer--run 集群 " + clusterId + " 将项目 " + projectId + "在节点" + maxRestParallelismNode + " 执行!");
|
|
log.info("ProjectConsumer--run 集群 " + clusterId + " 将项目 " + projectId + "在节点" + maxRestParallelismNode + " 执行!");
|
|
parseProject(projectId, projectType, projectJson, "cluster:" + clusterId, projectRunningKey, maxRestParallelismNode, parallelism);
|
|
parseProject(projectId, projectType, projectJson, "cluster:" + clusterId, projectRunningKey, maxRestParallelismNode, parallelism);
|
|
- return true;
|
|
|
|
- } else if (maxRestParallelism > 0) {
|
|
|
|
|
|
+ } else if (maxRestParallelism > 0L) {
|
|
log.info("ProjectConsumer--run 集群 " + clusterId + " 将项目 " + projectId + "在节点" + maxRestParallelismNode + " 执行!");
|
|
log.info("ProjectConsumer--run 集群 " + clusterId + " 将项目 " + projectId + "在节点" + maxRestParallelismNode + " 执行!");
|
|
parseProject(projectId, projectType, projectJson, "cluster:" + clusterId, projectRunningKey, maxRestParallelismNode, maxRestParallelism);
|
|
parseProject(projectId, projectType, projectJson, "cluster:" + clusterId, projectRunningKey, maxRestParallelismNode, maxRestParallelism);
|
|
- return true;
|
|
|
|
} else {
|
|
} else {
|
|
- return false;
|
|
|
|
|
|
+ wait(clusterId, projectId, projectWaitingKey, projectJson);
|
|
|
|
+ log.info("ProjectConsumer--cacheManualProject 服务器资源不够,项目 " + projectId + " 暂时加入等待队列。");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * @param clusterId
|
|
|
|
+ * @param projectId
|
|
|
|
+ * @param projectWaitingKey
|
|
|
|
+ * @param projectJson
|
|
|
|
+ */
|
|
public void wait(String clusterId, String projectId, String projectWaitingKey, String projectJson) {
|
|
public void wait(String clusterId, String projectId, String projectWaitingKey, String projectJson) {
|
|
log.info("ProjectConsumer--wait 集群 " + clusterId + " 将项目 " + projectId + " 放入等待队列!");
|
|
log.info("ProjectConsumer--wait 集群 " + clusterId + " 将项目 " + projectId + " 放入等待队列!");
|
|
stringRedisTemplate.opsForValue().set(projectWaitingKey, projectJson);
|
|
stringRedisTemplate.opsForValue().set(projectWaitingKey, projectJson);
|