|
@@ -300,7 +300,7 @@ public class ProjectConsumer {
|
|
|
*/
|
|
|
@SneakyThrows
|
|
|
public void cacheProject(ProjectMessageDTO projectMessageDTO) {
|
|
|
- log.info("判断用户是否拥有可分配资源:" + projectMessageDTO);
|
|
|
+ log.debug("判断用户是否拥有可分配资源:" + projectMessageDTO);
|
|
|
//1 读取 kafka 的 project 信息
|
|
|
final String modelType = projectMessageDTO.getModelType();
|
|
|
String projectId = projectMessageDTO.getProjectId(); // 手动执行项目 id 或 自动执行子项目 id
|
|
@@ -316,23 +316,23 @@ public class ProjectConsumer {
|
|
|
String clusterUserId; // 项目实际运行使用的用户集群
|
|
|
if (DictConstants.ROLE_CODE_SYSADMIN.equals(roleCode) || DictConstants.ROLE_CODE_ADMIN.equals(roleCode)) { //3-1 管理员账户和管理员子账户直接执行
|
|
|
clusterUserId = DictConstants.SYSTEM_CLUSTER_ID;
|
|
|
- log.info("项目 " + projectId + " 的创建人 " + projectUserId + " 为管理员账户或管理员子账户,直接判断服务器能否执行。");
|
|
|
+ log.debug("项目 " + projectId + " 的创建人 " + projectUserId + " 为管理员账户或管理员子账户,直接判断服务器能否执行。");
|
|
|
PrefixEntity redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(DictConstants.SYSTEM_CLUSTER_ID, projectId);
|
|
|
run(projectMessageDTO, clusterUserId, modelType, DictConstants.SYSTEM_USER_ID, redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey());
|
|
|
return;
|
|
|
} else if (DictConstants.ROLE_CODE_UESR.equals(roleCode)) { //3-2 普通账户,不管是独占还是共享,都在自己的集群里排队,根据自己的独占节点排队
|
|
|
clusterUserId = projectUserId;
|
|
|
clusterEntity = clusterMapper.selectByUserId(clusterUserId);
|
|
|
- log.info("项目 " + projectId + " 的创建人 " + projectUserId + " 为普通账户(包括独占或共享都在自己的集群),集群为:" + clusterEntity);
|
|
|
+ log.debug("项目 " + projectId + " 的创建人 " + projectUserId + " 为普通账户(包括独占或共享都在自己的集群),集群为:" + clusterEntity);
|
|
|
} else if (DictConstants.ROLE_CODE_SUBUESR.equals(roleCode)) {
|
|
|
if (DictConstants.USER_TYPE_EXCLUSIVE.equals(useType)) { //3-3 普通子账户,根据自己的独占节点排队
|
|
|
clusterUserId = projectUserId;
|
|
|
clusterEntity = clusterMapper.selectByUserId(clusterUserId);
|
|
|
- log.info("项目 " + projectId + " 的创建人 " + projectUserId + " 为普通独占子账户(自己的集群),集群为:" + clusterEntity);
|
|
|
+ log.debug("项目 " + projectId + " 的创建人 " + projectUserId + " 为普通独占子账户(自己的集群),集群为:" + clusterEntity);
|
|
|
} else if (DictConstants.USER_TYPE_PUBLIC.equals(useType)) { //3-4 共享子账户,根据父账户的共享节点排队
|
|
|
clusterUserId = userEntity.getCreateUserId();
|
|
|
clusterEntity = clusterMapper.selectByUserId(clusterUserId);
|
|
|
- log.info("项目 " + projectId + " 的创建人 " + projectUserId + " 为普通共享子账户(父账户的集群),集群为:" + clusterEntity);
|
|
|
+ log.debug("项目 " + projectId + " 的创建人 " + projectUserId + " 为普通共享子账户(父账户的集群),集群为:" + clusterEntity);
|
|
|
} else {
|
|
|
throw new RuntimeException("用户" + projectUserId + "未知占用类型:" + useType);
|
|
|
}
|
|
@@ -340,15 +340,20 @@ public class ProjectConsumer {
|
|
|
throw new RuntimeException("未知角色类型:" + roleCode);
|
|
|
}
|
|
|
PrefixEntity redisPrefix = projectUtil.getRedisPrefixByClusterIdAndProjectId(clusterEntity.getId(), projectId);
|
|
|
+ final Integer usingSimulationLicenseNumber = projectUtil.getUsingLicenseNumber(clusterUserId, DictConstants.LICENSE_TYPE_SIMULATION);
|
|
|
+ final Integer usingDynamicLicenseNumber;
|
|
|
+ final Integer numSimulationLicense = clusterEntity.getNumSimulationLicense();
|
|
|
+ final Integer numDynamicLicense = clusterEntity.getNumDynamicLicense();
|
|
|
+ final String clusterId = clusterEntity.getId();
|
|
|
if (DictConstants.MODEL_TYPE_VTD.equals(modelType)) {
|
|
|
// 获取仿真软件证书数量和动力学软件证书数量(vtd占一个仿真证书,carsim各占一个)
|
|
|
// // 获取正在运行的项目的并行度总和
|
|
|
// int currentParallelismSum = projectUtil.getCurrentParallelismSum(redisPrefix.getClusterRunningPrefix());
|
|
|
// 如果执行后的并行度总和小于最大节点数则执行,否则不执行
|
|
|
- if (projectUtil.getUsingLicenseNumber(clusterUserId, DictConstants.MODEL_TYPE_VTD) + parallelism <= clusterEntity.getNumSimulationLicense()) {
|
|
|
+ if (usingSimulationLicenseNumber + parallelism <= numSimulationLicense) {
|
|
|
run(projectMessageDTO, clusterUserId, modelType, clusterEntity.getId(), redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey());
|
|
|
} else {
|
|
|
- log.info("VTD 项目 " + projectId + " 并行度超出账户允许,加入等待队列,暂不执行。 ");
|
|
|
+ log.info("VTD 项目 {} 并行度为 {},用户 {} 的集群 {} 的仿真证书总数量为 {},已使用数量为 {}。该项目加入等待队列。 ", projectId, parallelism, clusterUserId, clusterId, numSimulationLicense, usingSimulationLicenseNumber);
|
|
|
wait(redisPrefix.getProjectWaitingKey(), projectMessageDTO);
|
|
|
}
|
|
|
} else if (DictConstants.MODEL_TYPE_CARSIM.equals(modelType)) {
|
|
@@ -356,10 +361,11 @@ public class ProjectConsumer {
|
|
|
// // 获取正在运行的项目的并行度总和
|
|
|
// int currentParallelismSum = projectUtil.getCurrentParallelismSum(redisPrefix.getClusterRunningPrefix());
|
|
|
// 如果执行后的并行度总和小于最大节点数则执行,否则不执行
|
|
|
- if (projectUtil.getUsingLicenseNumber(clusterUserId, DictConstants.MODEL_TYPE_VTD) + parallelism <= clusterEntity.getNumSimulationLicense() && projectUtil.getUsingLicenseNumber(clusterUserId, DictConstants.MODEL_TYPE_CARSIM) + parallelism <= clusterEntity.getNumDynamicLicense()) {
|
|
|
+ usingDynamicLicenseNumber = projectUtil.getUsingLicenseNumber(clusterUserId, DictConstants.LICENSE_TYPE_DYNAMIC);
|
|
|
+ if (usingSimulationLicenseNumber + parallelism <= numSimulationLicense && usingDynamicLicenseNumber + parallelism <= numDynamicLicense) {
|
|
|
run(projectMessageDTO, clusterUserId, modelType, clusterEntity.getId(), redisPrefix.getProjectRunningKey(), redisPrefix.getProjectWaitingKey());
|
|
|
} else {
|
|
|
- log.info("CARSIM 项目 " + projectId + " 并行度超出账户允许,加入等待队列,暂不执行。 ");
|
|
|
+ log.info("CARSIM 项目 {} 并行度为 {},用户 {} 的集群 {} 的仿真证书总数量为 {},已使用数量为 {},动力学证书总数量为 {},已使用数量为 {}。该项目加入等待队列。 ", projectId, parallelism, clusterUserId, clusterId, numSimulationLicense, usingSimulationLicenseNumber, numDynamicLicense, usingDynamicLicenseNumber);
|
|
|
wait(redisPrefix.getProjectWaitingKey(), projectMessageDTO);
|
|
|
}
|
|
|
} else {
|