From f5ea7d25b9e7f5ba539869681cd8627aae7b2129 Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Mon, 28 Dec 2020 19:36:58 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96):=20=E6=89=A7=E8=A1=8C=E5=9C=BA=E6=99=AF=E9=9D=9E?= =?UTF-8?q?=E5=8F=98=E9=87=8F=E7=9A=84=E5=8F=82=E6=95=B0=E4=B8=8D=E5=81=9A?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/definition/request/MsTestElement.java | 1 - .../request/sampler/MsHTTPSamplerProxy.java | 7 +- .../metersphere/api/jmeter/JMeterService.java | 2 +- .../api/parse/old/JmeterDocumentParser.java | 10 + .../api/service/ApiAutomationService.java | 30 ++- .../api/service/ApiDefinitionService.java | 14 +- .../components/common/json/JsonTable.vue | 211 ++++++++++++++++++ 7 files changed, 267 insertions(+), 8 deletions(-) create mode 100644 frontend/src/business/components/common/json/JsonTable.vue diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsTestElement.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsTestElement.java index 51bbf47d72..5c60342d6d 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/MsTestElement.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/MsTestElement.java @@ -101,7 +101,6 @@ public abstract class MsTestElement { public String getJmx(HashTree hashTree) { try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { SaveService.saveTree(hashTree, baos); - System.out.print(baos.toString()); return baos.toString(); } catch (Exception e) { e.printStackTrace(); diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index b3f5c2aedc..0a633e7251 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -158,12 +158,13 @@ public class MsHTTPSamplerProxy extends MsTestElement { sampler.setDomain(URLDecoder.decode(urlObject.getHost(), "UTF-8")); sampler.setPort(urlObject.getPort()); sampler.setProtocol(urlObject.getProtocol()); - + String envPath = StringUtils.equals(urlObject.getPath(), "/") ? "" : urlObject.getPath(); if (CollectionUtils.isNotEmpty(this.getRest()) && this.isRest()) { - sampler.setPath(getRestParameters(URLDecoder.decode(urlObject.getPath(), "UTF-8"))); + envPath = getRestParameters(URLDecoder.decode(envPath, "UTF-8")); + sampler.setPath(envPath); } if (CollectionUtils.isNotEmpty(this.getArguments())) { - sampler.setPath(getPostQueryParameters(URLDecoder.decode(urlObject.getPath(), "UTF-8"))); + sampler.setPath(getPostQueryParameters(URLDecoder.decode(envPath, "UTF-8"))); } } } catch (Exception e) { diff --git a/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java b/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java index df70761830..b02f2474d5 100644 --- a/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java +++ b/backend/src/main/java/io/metersphere/api/jmeter/JMeterService.java @@ -66,7 +66,7 @@ public class JMeterService { } } - private HashTree getHashTree(Object scriptWrapper) throws Exception { + public static HashTree getHashTree(Object scriptWrapper) throws Exception { Field field = scriptWrapper.getClass().getDeclaredField("testPlan"); field.setAccessible(true); return (HashTree) field.get(scriptWrapper); diff --git a/backend/src/main/java/io/metersphere/api/parse/old/JmeterDocumentParser.java b/backend/src/main/java/io/metersphere/api/parse/old/JmeterDocumentParser.java index f406b826d5..5825b19b57 100644 --- a/backend/src/main/java/io/metersphere/api/parse/old/JmeterDocumentParser.java +++ b/backend/src/main/java/io/metersphere/api/parse/old/JmeterDocumentParser.java @@ -166,6 +166,16 @@ public class JmeterDocumentParser { u += k + "=" + v; return u; }); + //rest参数处理 + if (url.contains("@")) { + String vars[] = url.split("@"); + for (String item : vars) { + if (item.endsWith("/")) { + item = item.substring(0, item.length() - 1); + } + url = url.replace("@" + item, ScriptEngineUtils.calculate("@" + item)); + } + } ele.setTextContent(url + ((params != null && !params.equals("?")) ? params : "")); break; case "Argument.value": diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index d8c0ff940d..0f4c0ab9d8 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -13,6 +13,7 @@ import io.metersphere.api.dto.definition.request.*; import io.metersphere.api.dto.scenario.KeyValue; import io.metersphere.api.dto.scenario.environment.EnvironmentConfig; import io.metersphere.api.jmeter.JMeterService; +import io.metersphere.api.parse.old.JmeterDocumentParser; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiScenarioReportMapper; @@ -38,6 +39,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.jmeter.save.SaveService; import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.ListedHashTree; import org.springframework.stereotype.Service; @@ -45,6 +47,8 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.util.*; import java.util.stream.Collectors; @@ -356,7 +360,18 @@ public class ApiAutomationService { runMode = ApiRunMode.SCENARIO_PLAN.name(); } // 调用执行方法 - jMeterService.runDefinition(request.getId(), jmeterHashTree, request.getReportId(), runMode); + String jmx = testPlan.getJmx(jmeterHashTree); + byte[] bytes = JmeterDocumentParser.parse(jmx.getBytes()); + InputStream is = new ByteArrayInputStream(bytes); + try { + Object scriptWrapper = SaveService.loadElement(is); + HashTree hashTree = JMeterService.getHashTree(scriptWrapper); + // 调用执行方法 + jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), runMode); + } catch (Exception e) { + e.printStackTrace(); + LogUtil.error(e.getMessage()); + } return request.getId(); } @@ -380,9 +395,20 @@ public class ApiAutomationService { config.setConfig(envConfig); HashTree hashTree = request.getTestElement().generateHashTree(config); // 调用执行方法 - jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), ApiRunMode.SCENARIO.name()); + String jmx = request.getTestElement().getJmx(hashTree); createScenarioReport(request.getId(), request.getScenarioId(), request.getScenarioName(), ReportTriggerMode.MANUAL.name(), request.getExecuteType(), request.getProjectId(), SessionUtils.getUserId()); + byte[] bytes = JmeterDocumentParser.parse(jmx.getBytes()); + InputStream is = new ByteArrayInputStream(bytes); + try { + Object scriptWrapper = SaveService.loadElement(is); + HashTree jmeterHashTree = JMeterService.getHashTree(scriptWrapper); + // 调用执行方法 + jMeterService.runDefinition(request.getId(), jmeterHashTree, request.getReportId(), ApiRunMode.SCENARIO.name()); + } catch (Exception e) { + e.printStackTrace(); + LogUtil.error(e.getMessage()); + } return request.getId(); } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index da1c4eed4a..4dc8b340d0 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -14,6 +14,7 @@ import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.jmeter.TestResult; import io.metersphere.api.parse.ApiImportParser; import io.metersphere.api.parse.ApiImportParserFactory; +import io.metersphere.api.parse.old.JmeterDocumentParser; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiDefinitionMapper; import io.metersphere.base.mapper.ApiTestFileMapper; @@ -34,6 +35,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.jmeter.save.SaveService; import org.apache.jorphan.collections.HashTree; import org.aspectj.util.FileUtil; import org.springframework.stereotype.Service; @@ -307,7 +309,17 @@ public class ApiDefinitionService { runMode = ApiRunMode.API_PLAN.name(); } // 调用执行方法 - jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), runMode); + String jmx = request.getTestElement().getJmx(hashTree); + byte[] bytes = JmeterDocumentParser.parse(jmx.getBytes()); + InputStream is = new ByteArrayInputStream(bytes); + try { + Object scriptWrapper = SaveService.loadElement(is); + HashTree testPlan = JMeterService.getHashTree(scriptWrapper); + // 调用执行方法 + jMeterService.runDefinition(request.getId(), testPlan, request.getReportId(), runMode); + } catch (Exception e) { + e.printStackTrace(); + } return request.getId(); } diff --git a/frontend/src/business/components/common/json/JsonTable.vue b/frontend/src/business/components/common/json/JsonTable.vue new file mode 100644 index 0000000000..511929f7e7 --- /dev/null +++ b/frontend/src/business/components/common/json/JsonTable.vue @@ -0,0 +1,211 @@ + + + + From 711c787f8d23a4537f4feef1fca74a5dfa6bbffc Mon Sep 17 00:00:00 2001 From: fit2-zhao Date: Tue, 29 Dec 2020 09:56:26 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix(=E6=8E=A5=E5=8F=A3=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96):=20=E6=B7=BB=E5=8A=A0=E6=89=A7=E8=A1=8C=E6=97=B6=20m?= =?UTF-8?q?ock=20=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../request/sampler/MsHTTPSamplerProxy.java | 9 +++-- .../api/service/ApiAutomationService.java | 33 +++---------------- .../api/service/ApiDefinitionService.java | 14 +------- 3 files changed, 11 insertions(+), 45 deletions(-) diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java index 0a633e7251..cc4947e9ff 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/request/sampler/MsHTTPSamplerProxy.java @@ -13,6 +13,7 @@ import io.metersphere.api.service.ApiTestEnvironmentService; import io.metersphere.base.domain.ApiTestEnvironmentWithBLOBs; import io.metersphere.commons.utils.CommonBeanFactory; import io.metersphere.commons.utils.LogUtil; +import io.metersphere.commons.utils.ScriptEngineUtils; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.commons.collections.CollectionUtils; @@ -222,7 +223,8 @@ public class MsHTTPSamplerProxy extends MsTestElement { stringBuffer.append("/"); Map keyValueMap = new HashMap<>(); this.getRest().stream().filter(KeyValue::isEnable).filter(KeyValue::isValid).forEach(keyValue -> - keyValueMap.put(keyValue.getName(), keyValue.getValue()) + keyValueMap.put(keyValue.getName(), keyValue.getValue() != null && keyValue.getValue().startsWith("@") ? + ScriptEngineUtils.calculate(keyValue.getValue()) : keyValue.getValue()) ); try { Pattern p = Pattern.compile("(\\{)([\\w]+)(\\})"); @@ -244,7 +246,8 @@ public class MsHTTPSamplerProxy extends MsTestElement { stringBuffer.append(path); stringBuffer.append("?"); this.getArguments().stream().filter(KeyValue::isEnable).filter(KeyValue::isValid).forEach(keyValue -> - stringBuffer.append(keyValue.getName()).append("=").append(keyValue.getValue()).append("&") + stringBuffer.append(keyValue.getName()).append("=").append(keyValue.getValue() != null && keyValue.getValue().startsWith("@") ? + ScriptEngineUtils.calculate(keyValue.getValue()) : keyValue.getValue()).append("&") ); return stringBuffer.substring(0, stringBuffer.length() - 1); } @@ -252,7 +255,7 @@ public class MsHTTPSamplerProxy extends MsTestElement { private Arguments httpArguments(List list) { Arguments arguments = new Arguments(); list.stream().filter(KeyValue::isValid).filter(KeyValue::isEnable).forEach(keyValue -> { - HTTPArgument httpArgument = new HTTPArgument(keyValue.getName(), keyValue.getValue()); + HTTPArgument httpArgument = new HTTPArgument(keyValue.getName(), keyValue.getValue() != null && keyValue.getValue().startsWith("@") ? ScriptEngineUtils.calculate(keyValue.getValue()) : keyValue.getValue()); httpArgument.setAlwaysEncoded(keyValue.isEncode()); if (StringUtils.isNotBlank(keyValue.getContentType())) { httpArgument.setContentType(keyValue.getContentType()); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java index 0f4c0ab9d8..19c1b0376d 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiAutomationService.java @@ -13,7 +13,6 @@ import io.metersphere.api.dto.definition.request.*; import io.metersphere.api.dto.scenario.KeyValue; import io.metersphere.api.dto.scenario.environment.EnvironmentConfig; import io.metersphere.api.jmeter.JMeterService; -import io.metersphere.api.parse.old.JmeterDocumentParser; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiScenarioMapper; import io.metersphere.base.mapper.ApiScenarioReportMapper; @@ -39,7 +38,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.jmeter.save.SaveService; import org.apache.jorphan.collections.HashTree; import org.apache.jorphan.collections.ListedHashTree; import org.springframework.stereotype.Service; @@ -47,8 +45,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; -import java.io.ByteArrayInputStream; -import java.io.InputStream; import java.util.*; import java.util.stream.Collectors; @@ -353,25 +349,14 @@ public class ApiAutomationService { } catch (Exception ex) { LogUtil.error(ex.getMessage()); } - testPlan.toHashTree(jmeterHashTree, testPlan.getHashTree(), new ParameterConfig()); + testPlan.toHashTree(jmeterHashTree, testPlan.getHashTree(), new ParameterConfig()); String runMode = ApiRunMode.SCENARIO.name(); if (StringUtils.isNotBlank(request.getRunMode()) && StringUtils.equals(request.getRunMode(), ApiRunMode.SCENARIO_PLAN.name())) { runMode = ApiRunMode.SCENARIO_PLAN.name(); } // 调用执行方法 - String jmx = testPlan.getJmx(jmeterHashTree); - byte[] bytes = JmeterDocumentParser.parse(jmx.getBytes()); - InputStream is = new ByteArrayInputStream(bytes); - try { - Object scriptWrapper = SaveService.loadElement(is); - HashTree hashTree = JMeterService.getHashTree(scriptWrapper); - // 调用执行方法 - jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), runMode); - } catch (Exception e) { - e.printStackTrace(); - LogUtil.error(e.getMessage()); - } + jMeterService.runDefinition(request.getId(), jmeterHashTree, request.getReportId(), runMode); return request.getId(); } @@ -395,20 +380,10 @@ public class ApiAutomationService { config.setConfig(envConfig); HashTree hashTree = request.getTestElement().generateHashTree(config); // 调用执行方法 - String jmx = request.getTestElement().getJmx(hashTree); createScenarioReport(request.getId(), request.getScenarioId(), request.getScenarioName(), ReportTriggerMode.MANUAL.name(), request.getExecuteType(), request.getProjectId(), SessionUtils.getUserId()); - byte[] bytes = JmeterDocumentParser.parse(jmx.getBytes()); - InputStream is = new ByteArrayInputStream(bytes); - try { - Object scriptWrapper = SaveService.loadElement(is); - HashTree jmeterHashTree = JMeterService.getHashTree(scriptWrapper); - // 调用执行方法 - jMeterService.runDefinition(request.getId(), jmeterHashTree, request.getReportId(), ApiRunMode.SCENARIO.name()); - } catch (Exception e) { - e.printStackTrace(); - LogUtil.error(e.getMessage()); - } + // 调用执行方法 + jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), ApiRunMode.SCENARIO.name()); return request.getId(); } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index 4dc8b340d0..da1c4eed4a 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -14,7 +14,6 @@ import io.metersphere.api.jmeter.JMeterService; import io.metersphere.api.jmeter.TestResult; import io.metersphere.api.parse.ApiImportParser; import io.metersphere.api.parse.ApiImportParserFactory; -import io.metersphere.api.parse.old.JmeterDocumentParser; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiDefinitionMapper; import io.metersphere.base.mapper.ApiTestFileMapper; @@ -35,7 +34,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; -import org.apache.jmeter.save.SaveService; import org.apache.jorphan.collections.HashTree; import org.aspectj.util.FileUtil; import org.springframework.stereotype.Service; @@ -309,17 +307,7 @@ public class ApiDefinitionService { runMode = ApiRunMode.API_PLAN.name(); } // 调用执行方法 - String jmx = request.getTestElement().getJmx(hashTree); - byte[] bytes = JmeterDocumentParser.parse(jmx.getBytes()); - InputStream is = new ByteArrayInputStream(bytes); - try { - Object scriptWrapper = SaveService.loadElement(is); - HashTree testPlan = JMeterService.getHashTree(scriptWrapper); - // 调用执行方法 - jMeterService.runDefinition(request.getId(), testPlan, request.getReportId(), runMode); - } catch (Exception e) { - e.printStackTrace(); - } + jMeterService.runDefinition(request.getId(), hashTree, request.getReportId(), runMode); return request.getId(); } From c52fddbe1928d54bf27e6f41c94785c5d2e49f98 Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Tue, 29 Dec 2020 10:54:08 +0800 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=E5=9B=BD=E9=99=85=E5=8C=96=20n?= =?UTF-8?q?ot=20support=20key=20=E6=98=BE=E7=A4=BA=E5=85=B7=E4=BD=93?= =?UTF-8?q?=E7=9A=84key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/io/metersphere/i18n/Translator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/io/metersphere/i18n/Translator.java b/backend/src/main/java/io/metersphere/i18n/Translator.java index 0f0303c466..1b0cebec47 100644 --- a/backend/src/main/java/io/metersphere/i18n/Translator.java +++ b/backend/src/main/java/io/metersphere/i18n/Translator.java @@ -17,6 +17,6 @@ public class Translator { * 单Key翻译 */ public static String get(String key) { - return messageSource.getMessage(key, null, "Not Support Key", LocaleContextHolder.getLocale()); + return messageSource.getMessage(key, null, "Not Support Key: " + key, LocaleContextHolder.getLocale()); } } From 1154b3ce803a700f7f1d17754078e24d5f11c125 Mon Sep 17 00:00:00 2001 From: "Captain.B" Date: Tue, 29 Dec 2020 11:02:53 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9k8s=E8=B5=84?= =?UTF-8?q?=E6=BA=90=E6=B1=A0=E8=8A=82=E7=82=B9=E9=AA=8C=E8=AF=81=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/main/java/io/metersphere/xpack | 2 +- backend/src/main/resources/i18n/messages_en_US.properties | 1 + backend/src/main/resources/i18n/messages_zh_CN.properties | 1 + backend/src/main/resources/i18n/messages_zh_TW.properties | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/io/metersphere/xpack b/backend/src/main/java/io/metersphere/xpack index f27d1609d7..c10b11f224 160000 --- a/backend/src/main/java/io/metersphere/xpack +++ b/backend/src/main/java/io/metersphere/xpack @@ -1 +1 @@ -Subproject commit f27d1609d77f7d6c988d37d709466e844d350e17 +Subproject commit c10b11f224e4186306e6ae3a3976e29a42af96a5 diff --git a/backend/src/main/resources/i18n/messages_en_US.properties b/backend/src/main/resources/i18n/messages_en_US.properties index da8d250df6..ae2aa26f23 100644 --- a/backend/src/main/resources/i18n/messages_en_US.properties +++ b/backend/src/main/resources/i18n/messages_en_US.properties @@ -60,6 +60,7 @@ test_resource_pool_name_is_null=Test Resource Pool name cannot be null test_resource_pool_name_already_exists=The test resource pool name already exists load_test=Load Test test_resource_pool_is_use=This resource pool is in use and cannot be deleted +only_one_k8s=Only one K8S can be added #project project_name_is_null=Project name cannot be null project_name_already_exists=The project name already exists diff --git a/backend/src/main/resources/i18n/messages_zh_CN.properties b/backend/src/main/resources/i18n/messages_zh_CN.properties index 0b440262da..983fac6be2 100644 --- a/backend/src/main/resources/i18n/messages_zh_CN.properties +++ b/backend/src/main/resources/i18n/messages_zh_CN.properties @@ -60,6 +60,7 @@ test_resource_pool_name_is_null=资源池名称不能为空 test_resource_pool_name_already_exists=资源池名称已存在 load_test=性能测试 test_resource_pool_is_use=正在使用此资源池,无法删除 +only_one_k8s=只能添加一个 K8S #project project_name_is_null=项目名称不能为空 project_name_already_exists=项目名称已存在 diff --git a/backend/src/main/resources/i18n/messages_zh_TW.properties b/backend/src/main/resources/i18n/messages_zh_TW.properties index 56b0884a60..97a457beb3 100644 --- a/backend/src/main/resources/i18n/messages_zh_TW.properties +++ b/backend/src/main/resources/i18n/messages_zh_TW.properties @@ -60,6 +60,7 @@ test_resource_pool_name_is_null=資源池名稱不能為空 test_resource_pool_name_already_exists=資源池名稱已存在 load_test=性能測試 test_resource_pool_is_use=正在使用此資源池,無法刪除 +only_one_k8s=只能添加一個 K8S #project project_name_is_null=項目名稱不能為空 project_name_already_exists=項目名稱已存在