feat: 增加资源池校验
This commit is contained in:
parent
7244e1148a
commit
f26ec51b44
|
@ -5,5 +5,5 @@ import io.metersphere.sdk.dto.TestResourceDTO;
|
|||
|
||||
public interface KubernetesResourcePoolService {
|
||||
|
||||
boolean validate(TestResourceDTO testResourceDT);
|
||||
boolean validate(TestResourceDTO testResourceDTO, Boolean usedApiType);
|
||||
}
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
package io.metersphere.sdk.service;
|
||||
|
||||
|
||||
import io.metersphere.sdk.dto.TestResourceDTO;
|
||||
|
||||
public interface LoadResourceService {
|
||||
|
||||
boolean validate(TestResourceDTO testResourceDTO, String type);
|
||||
|
||||
}
|
|
@ -1,22 +1,72 @@
|
|||
package io.metersphere.sdk.service;
|
||||
|
||||
|
||||
import io.metersphere.sdk.controller.handler.ResultHolder;
|
||||
import io.metersphere.sdk.dto.TestResourceDTO;
|
||||
import io.metersphere.sdk.dto.TestResourceNodeDTO;
|
||||
import io.metersphere.sdk.exception.MSException;
|
||||
import io.metersphere.sdk.util.LogUtils;
|
||||
import io.metersphere.sdk.util.Translator;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public class NodeResourcePoolService {
|
||||
|
||||
private final static String nodeControllerUrl = "http://%s:%s/status";
|
||||
|
||||
private static final RestTemplate restTemplateWithTimeOut = new RestTemplate();
|
||||
static {
|
||||
HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
|
||||
httpRequestFactory.setConnectionRequestTimeout(2000);
|
||||
httpRequestFactory.setConnectTimeout(2000);
|
||||
restTemplateWithTimeOut.setRequestFactory(httpRequestFactory);
|
||||
}
|
||||
|
||||
public boolean validate(TestResourceDTO testResourceDTO) {
|
||||
if (CollectionUtils.isEmpty(testResourceDTO.getNodesList())) {
|
||||
List<TestResourceNodeDTO> nodesList = testResourceDTO.getNodesList();
|
||||
if (CollectionUtils.isEmpty(nodesList)) {
|
||||
throw new MSException(Translator.get("no_nodes_message"));
|
||||
}
|
||||
//校验节点
|
||||
List<ImmutablePair<String, String>> ipPort = nodesList.stream()
|
||||
.map(resource -> {
|
||||
return new ImmutablePair<>(resource.getIp(), resource.getPort());
|
||||
})
|
||||
.distinct()
|
||||
.toList();
|
||||
if (ipPort.size() < nodesList.size()) {
|
||||
throw new MSException(Translator.get("duplicate_node_ip_port"));
|
||||
}
|
||||
boolean isValid = true;
|
||||
for (TestResourceNodeDTO testResourceNodeDTO : nodesList) {
|
||||
isValid = validateNode(testResourceNodeDTO);
|
||||
}
|
||||
return isValid;
|
||||
}
|
||||
|
||||
private boolean validateNode(TestResourceNodeDTO node) {
|
||||
try {
|
||||
ResponseEntity<ResultHolder> entity = restTemplateWithTimeOut.getForEntity(String.format(nodeControllerUrl, node.getIp(), node.getPort()), ResultHolder.class);
|
||||
ResultHolder body = entity.getBody();
|
||||
if (body == null) {
|
||||
return false;
|
||||
}
|
||||
if (body.getData() != null && StringUtils.equalsIgnoreCase("OK", body.getData().toString())) {
|
||||
return true;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
LogUtils.error(e.getMessage(), e);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ import org.mybatis.spring.SqlSessionUtils;
|
|||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
@ -104,11 +103,28 @@ public class TestResourcePoolService {
|
|||
if (testResourcePool.getLoadTest() == null || !testResourcePool.getLoadTest()) {
|
||||
return true;
|
||||
}
|
||||
LoadResourceService resourcePoolService = CommonBeanFactory.getBean(LoadResourceService.class);
|
||||
boolean validate = checkNodeOrK8s(testResourceDTO, type, false);
|
||||
if (!validate) {
|
||||
testResourcePool.setEnable(false);
|
||||
}
|
||||
return validate;
|
||||
}
|
||||
|
||||
private static boolean checkNodeOrK8s(TestResourceDTO testResourceDTO, String type, Boolean usedApiType) {
|
||||
if (StringUtils.equalsIgnoreCase(type,ResourcePoolTypeEnum.NODE.name())) {
|
||||
NodeResourcePoolService resourcePoolService = CommonBeanFactory.getBean(NodeResourcePoolService.class);
|
||||
if (resourcePoolService != null) {
|
||||
return resourcePoolService.validate(testResourceDTO);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
KubernetesResourcePoolService resourcePoolService = CommonBeanFactory.getBean(KubernetesResourcePoolService.class);
|
||||
if (resourcePoolService == null) {
|
||||
return false;
|
||||
}
|
||||
return resourcePoolService.validate(testResourceDTO,type);
|
||||
return resourcePoolService.validate(testResourceDTO, usedApiType);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean checkUiConfig(TestResourceDTO testResourceDTO, TestResourcePool testResourcePool) {
|
||||
|
@ -124,19 +140,13 @@ public class TestResourcePoolService {
|
|||
|
||||
private boolean checkApiConfig(TestResourceDTO testResourceDTO, TestResourcePool testResourcePool, String type) {
|
||||
if (testResourcePool.getApiTest() == null || !testResourcePool.getApiTest()) {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (StringUtils.equalsIgnoreCase(type,ResourcePoolTypeEnum.NODE.name())) {
|
||||
NodeResourcePoolService resourcePoolService = CommonBeanFactory.getBean(NodeResourcePoolService.class);
|
||||
return resourcePoolService.validate(testResourceDTO);
|
||||
} else {
|
||||
KubernetesResourcePoolService resourcePoolService = CommonBeanFactory.getBean(KubernetesResourcePoolService.class);
|
||||
if (resourcePoolService == null) {
|
||||
return false;
|
||||
}
|
||||
return resourcePoolService.validate(testResourceDTO);
|
||||
boolean validate = checkNodeOrK8s(testResourceDTO, type, true);
|
||||
if (!validate) {
|
||||
testResourcePool.setEnable(false);
|
||||
}
|
||||
return validate;
|
||||
}
|
||||
|
||||
public void deleteTestResourcePool(String testResourcePoolId) {
|
||||
|
|
|
@ -73,6 +73,12 @@ test_resource_pool_is_use=This resource pool is in use and cannot be deleted
|
|||
only_one_k8s=Only one K8S can be added
|
||||
test_resource_pool_not_exists=Test resource pool not exists
|
||||
test_resource_pool_invalid=Test resource pool invalid
|
||||
selenium_grid_is_null=selenium_grid cannot be null
|
||||
ip_is_null=ip address/domain name cannot be null
|
||||
token_is_null = Token can not be null
|
||||
namespace_is_null=Namespaces can not be null
|
||||
deploy_name_is_null=Deploy Name cannot be null
|
||||
api_test_image_is_null=API cannot be null
|
||||
#project
|
||||
project_name_is_null=Project name cannot be null
|
||||
project_name_already_exists=The project name already exists
|
||||
|
|
|
@ -72,6 +72,14 @@ test_resource_pool_is_use=正在使用此资源池,无法删除
|
|||
only_one_k8s=只能添加一个 K8S
|
||||
test_resource_pool_not_exists=测试资源池不存在
|
||||
test_resource_pool_invalid=当前测试使用的资源池处于禁用状态
|
||||
selenium_grid_is_null=selenium_grid不能为空
|
||||
ip_is_null=ip 地址/域名不能为空
|
||||
token_is_null = Token 不能为空
|
||||
namespace_is_null=命名空间不能为空
|
||||
deploy_name_is_null=Deploy Name 不能为空
|
||||
api_test_image_is_null=API 镜像不能为空
|
||||
|
||||
|
||||
#project
|
||||
project_name_is_null=项目名称不能为空
|
||||
project_name_already_exists=项目名称已存在
|
||||
|
|
|
@ -73,6 +73,12 @@ test_resource_pool_is_use=正在使用此資源池,無法刪除
|
|||
only_one_k8s=只能添加一個 K8S
|
||||
test_resource_pool_not_exists=測試資源池不存在
|
||||
test_resource_pool_invalid=當前測試使用的資源池處於禁用狀態
|
||||
selenium_grid_is_null=selenium_grid不能為空
|
||||
ip_is_null=ip 地址/域名不能為空
|
||||
token_is_null = Token 不能為空
|
||||
namespace_is_null=命名空間不能為空
|
||||
deploy_name_is_null=Deploy Name 不能為空
|
||||
api_test_image_is_null=API 鏡像不能為空
|
||||
#project
|
||||
project_name_is_null=項目名稱不能為空
|
||||
project_name_already_exists=項目名稱已存在
|
||||
|
|
Loading…
Reference in New Issue