diff --git a/backend/framework/domain/src/main/java/io/metersphere/system/domain/TestResource.java b/backend/framework/domain/src/main/java/io/metersphere/system/domain/TestResource.java
index 1412140a54..096072da57 100644
--- a/backend/framework/domain/src/main/java/io/metersphere/system/domain/TestResource.java
+++ b/backend/framework/domain/src/main/java/io/metersphere/system/domain/TestResource.java
@@ -19,9 +19,8 @@ public class TestResource implements Serializable {
private String testResourcePoolId;
@Schema(title = "资源节点状态", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotBlank(message = "{test_resource.status.not_blank}", groups = {Created.class})
- @Size(min = 1, max = 20, message = "{test_resource.status.length_range}", groups = {Created.class, Updated.class})
- private String status;
+ @NotNull(message = "{test_resource.enable.not_blank}", groups = {Created.class})
+ private Boolean enable;
@Schema(title = "创建时间")
private Long createTime;
@@ -32,5 +31,9 @@ public class TestResource implements Serializable {
@Schema(title = "资源节点配置")
private byte[] configuration;
+ @Schema(title = "是否删除", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "{test_resource_pool.deleted.not_blank}", groups = {Created.class})
+ private Boolean deleted;
+
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
diff --git a/backend/framework/sdk/pom.xml b/backend/framework/sdk/pom.xml
index 20013cbf32..3508361cbc 100644
--- a/backend/framework/sdk/pom.xml
+++ b/backend/framework/sdk/pom.xml
@@ -419,6 +419,20 @@
${otp-java.version}
-
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+
+
+
+ test-jar
+
+
+
+
+
+
diff --git a/backend/framework/sdk/src/test/java/base/BaseTest.java b/backend/framework/sdk/src/test/java/base/BaseTest.java
new file mode 100644
index 0000000000..31c57d0be8
--- /dev/null
+++ b/backend/framework/sdk/src/test/java/base/BaseTest.java
@@ -0,0 +1,41 @@
+package base;
+
+import com.jayway.jsonpath.JsonPath;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.MvcResult;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@SpringBootTest
+@AutoConfigureMockMvc
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+public abstract class BaseTest {
+ @Resource
+ private MockMvc mockMvc;
+ protected static String sessionId;
+ protected static String csrfToken;
+
+ @BeforeEach
+ public void login() throws Exception {
+ if (StringUtils.isAnyBlank(sessionId, csrfToken)) {
+ MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/login")
+ .content("{\"username\":\"admin\",\"password\":\"metersphere\"}")
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().contentType(MediaType.APPLICATION_JSON))
+ .andReturn();
+ sessionId = JsonPath.read(mvcResult.getResponse().getContentAsString(), "$.data.sessionId");
+ csrfToken = JsonPath.read(mvcResult.getResponse().getContentAsString(), "$.data.csrfToken");
+ }
+ }
+}
diff --git a/backend/services/system-setting/pom.xml b/backend/services/system-setting/pom.xml
index eb613d9e37..283df44ed6 100644
--- a/backend/services/system-setting/pom.xml
+++ b/backend/services/system-setting/pom.xml
@@ -18,7 +18,14 @@
metersphere-sdk
${revision}
-
+
+ io.metersphere
+ metersphere-sdk
+ ${revision}
+ tests
+ test-jar
+ test
+
diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/consul/CacheNode.java b/backend/services/system-setting/src/main/java/io/metersphere/system/consul/CacheNode.java
new file mode 100644
index 0000000000..a836c9aa58
--- /dev/null
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/consul/CacheNode.java
@@ -0,0 +1,9 @@
+package io.metersphere.system.consul;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface CacheNode {
+}
diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/consul/CacheNodeAspect.java b/backend/services/system-setting/src/main/java/io/metersphere/system/consul/CacheNodeAspect.java
new file mode 100644
index 0000000000..39a66281d7
--- /dev/null
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/consul/CacheNodeAspect.java
@@ -0,0 +1,25 @@
+package io.metersphere.system.consul;
+
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+@Aspect
+@Component
+public class CacheNodeAspect {
+ /**
+ * 定义切点 @Pointcut 在注解的位置切入代码
+ */
+ @Pointcut("@annotation(io.metersphere.system.consul.CacheNode)")
+ public void cacheNodes() {
+ }
+
+ @After("cacheNodes()")
+ @Async
+ public void after() {
+ // microService.getForResultHolder(MicroServiceName.PERFORMANCE_TEST, "/performance/update/cache");
+ }
+
+}
diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/TestResourcePoolController.java b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/TestResourcePoolController.java
new file mode 100644
index 0000000000..e88b70caf5
--- /dev/null
+++ b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/TestResourcePoolController.java
@@ -0,0 +1,49 @@
+package io.metersphere.system.controller;
+
+import com.github.pagehelper.Page;
+import com.github.pagehelper.PageHelper;
+import io.metersphere.sdk.util.PageUtils;
+import io.metersphere.sdk.util.Pager;
+import io.metersphere.system.consul.CacheNode;
+import io.metersphere.system.dto.TestResourcePoolDTO;
+import io.metersphere.system.request.QueryResourcePoolRequest;
+import io.metersphere.system.service.TestResourcePoolService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+
+@RequestMapping("/test/resource/pool")
+@RestController
+public class TestResourcePoolController {
+
+ @Resource
+ private TestResourcePoolService testResourcePoolService;
+
+ @PostMapping("/add")
+ public TestResourcePoolDTO addTestResourcePool(@RequestBody TestResourcePoolDTO testResourcePoolDTO) {
+ return testResourcePoolService.addTestResourcePool(testResourcePoolDTO);
+ }
+
+ @GetMapping("/delete/{poolId}")
+ @CacheNode // 把监控节点缓存起来
+ public void deleteTestResourcePool(@PathVariable(value = "poolId") String testResourcePoolId) {
+ testResourcePoolService.deleteTestResourcePool(testResourcePoolId);
+ }
+
+ @PostMapping("/update")
+ @CacheNode // 把监控节点缓存起来
+ public void updateTestResourcePool(@RequestBody TestResourcePoolDTO testResourcePoolDTO) {
+ testResourcePoolService.updateTestResourcePool(testResourcePoolDTO);
+ }
+
+ @PostMapping("/page")
+ public Pager> listResourcePools( @RequestBody QueryResourcePoolRequest request) {
+ Page